
 import java.util.Calendar;
import java.util.Calendar;
 import java.util.*;
import java.util.*;
 import java.sql.Timestamp;
import java.sql.Timestamp;

 public class TimeFormat
public class TimeFormat


 {
{
 private static String[] keywords =
  private static String[] keywords =

 
       {
{
 "year", "month", "day", "hour", "minute", "second", "millisecond"};
      "year", "month", "day", "hour", "minute", "second", "millisecond"};
 private String format;
  private String format;
 private Calendar whatTime;
  private Calendar whatTime;

 public TimeFormat()
  public TimeFormat()

 
   {
{
 }
  }


 /** *//**
  /** *//**
 *
   *
 * @param format year-month-day hour:minute:second   2005-11-25 22:02
   * @param format year-month-day hour:minute:second   2005-11-25 22:02
 * @param timeStr
   * @param timeStr
 * @return
   * @return
 *
   *
 * year年month月day日 hour点minute分second秒
   * year年month月day日 hour点minute分second秒
 * 2005年11月25日 22点22分15秒
   * 2005年11月25日 22点22分15秒
 * 2005/11/25  22:22
   * 2005/11/25  22:22
 * 05/11/25 22:22
   * 05/11/25 22:22
 */
   */
 public static Calendar getTime(String format, String timeVarStr)
  public static Calendar getTime(String format, String timeVarStr)

 
   {
{
 String timeFormatStr = format;
    String timeFormatStr = format;
 Calendar whatTime = null;
    Calendar whatTime = null;
 int year = 0, month = 0, day = 0, hour = 0, minute = 0,
    int year = 0, month = 0, day = 0, hour = 0, minute = 0,
 second = 0, millisecond = 0;
        second = 0, millisecond = 0;

 String[] validTimeElements =
    String[] validTimeElements =

 
         {
{
 "year", "month", "day", "hour", "minute", "second", "millisecond"};
        "year", "month", "day", "hour", "minute", "second", "millisecond"};

 int dateVarCount = 0;
    int dateVarCount = 0;
 int index = -1;
    int index = -1;

 Vector tmpV = new Vector();
    Vector tmpV = new Vector();

 Map map = new HashMap();
    Map map = new HashMap();

 for (int i = 0; i < validTimeElements.length; i++)
    for (int i = 0; i < validTimeElements.length; i++)

 
     {
{
 int pos = format.indexOf(validTimeElements[i]);
       int pos = format.indexOf(validTimeElements[i]);
 if(pos>=0)
       if(pos>=0)

 
        {
{
 map.put(new Integer(pos),validTimeElements[i]);
         map.put(new Integer(pos),validTimeElements[i]);
 }
       }
 }
    }

 Object[] tmp = map.keySet().toArray();
    Object[] tmp = map.keySet().toArray();
 Integer[] tmpInt = new Integer[tmp.length];
    Integer[] tmpInt = new Integer[tmp.length];

 for(int i = 0; i<tmpInt.length;i++)
    for(int i = 0; i<tmpInt.length;i++)

 
     {
{
 tmpInt[i] = (Integer) tmp[i];
      tmpInt[i] = (Integer) tmp[i];
 }
    }

 //从小到大排序, 还原原来的顺序.
    //从小到大排序, 还原原来的顺序.
 Arrays.sort(tmpInt);
    Arrays.sort(tmpInt);
 String[] varNames  = new String[tmpInt.length];
    String[] varNames  = new String[tmpInt.length];

 for(int i=0;i<varNames.length;i++)
    for(int i=0;i<varNames.length;i++)

 
     {
{
 varNames[i] = (String) map.get(tmpInt[i]);
      varNames[i] = (String) map.get(tmpInt[i]);
 }
    }

 String[] varValue = getTimeInOriginOrder(timeVarStr); //变量值
    String[] varValue = getTimeInOriginOrder(timeVarStr); //变量值

 if(varValue==null)
    if(varValue==null)

 
     {
{
 System.out.println("获取时间变量的值出错了.");
      System.out.println("获取时间变量的值出错了.");
 return null;
      return null;
 }
    }

 int[] timeElementValue = new int[validTimeElements.length];
    int[] timeElementValue = new int[validTimeElements.length];

 for(int i=0;i<varNames.length;i++)
    for(int i=0;i<varNames.length;i++)

 
     {
{
 for(int j=0;j<validTimeElements.length;j++)
      for(int j=0;j<validTimeElements.length;j++)

 
       {
{
 if(varNames[i].equals(validTimeElements[j]))
        if(varNames[i].equals(validTimeElements[j]))

 
         {
{
 timeElementValue[j] = Integer.parseInt(varValue[i]);
          timeElementValue[j] = Integer.parseInt(varValue[i]);
 break;
          break;
 }
        }
 }
      }
 }
    }

 if(format.indexOf("month")>=0 || format.indexOf("day")>=0)
    if(format.indexOf("month")>=0 || format.indexOf("day")>=0)

 
     {
{
 if(format.indexOf("year")<0)
      if(format.indexOf("year")<0)

 
       {
{
 System.out.println("没有年, 使用当前的年为缺省值.");
        System.out.println("没有年, 使用当前的年为缺省值.");
 timeElementValue[0] = Calendar.getInstance().get(Calendar.YEAR);
        timeElementValue[0] = Calendar.getInstance().get(Calendar.YEAR);
 }
      }

 //目前禁止年份是非4位数字表示的
     //目前禁止年份是非4位数字表示的
 String tmpStr = timeElementValue[0]+"";
      String tmpStr = timeElementValue[0]+"";
 if(tmpStr.length()<4)
     if(tmpStr.length()<4)

 
      {
{
 System.out.println("目前禁止年份是非4位数字表示的,因为我们无法确定到底是哪一年");
        System.out.println("目前禁止年份是非4位数字表示的,因为我们无法确定到底是哪一年");
 return null;
        return null;
 }
     }


 whatTime =  Calendar.getInstance();
      whatTime =  Calendar.getInstance();
 whatTime.set(timeElementValue[0], timeElementValue[1] - 1,
      whatTime.set(timeElementValue[0], timeElementValue[1] - 1,
 timeElementValue[2], timeElementValue[3], timeElementValue[4],
                   timeElementValue[2], timeElementValue[3], timeElementValue[4],
 timeElementValue[5]);
                   timeElementValue[5]);
 }
    }
 else
    else

 
     {
{
 System.out.println("时间变量获取失败,至少必须又2个时间变量. year,month,day 必须都有, 可以允许year没有使用当前年份");
      System.out.println("时间变量获取失败,至少必须又2个时间变量. year,month,day 必须都有, 可以允许year没有使用当前年份");
 whatTime = null;
      whatTime = null;
 }
    }
 return whatTime;
    return whatTime;
 }
  }



 /** *//**
  /** *//**
 * 把时间变量的值按顺序取出,以逗号隔开
   * 把时间变量的值按顺序取出,以逗号隔开
 * @param val
   * @param val
 * @return
   * @return
 */
   */
 static private String[] getTimeInOriginOrder(String val)
  static private String[] getTimeInOriginOrder(String val)

 
   {
{
 String temp = "";
    String temp = "";
 String digital = "0123456789";
    String digital = "0123456789";
 for (int i = 0; i < val.length(); i++)
    for (int i = 0; i < val.length(); i++)

 
     {
{
 if (digital.indexOf(val.substring(i, i + 1)) > -1)
      if (digital.indexOf(val.substring(i, i + 1)) > -1)

 
       {
{
 temp = temp + val.substring(i, i + 1);
        temp = temp + val.substring(i, i + 1);
 }
      }
 else
      else

 
       {
{
 if (temp.length()>0 && temp.charAt(temp.length()-1)!=',' )
        if (temp.length()>0 && temp.charAt(temp.length()-1)!=',' )

 
         {
{
 temp = temp + ",";
          temp = temp + ",";
 }
        }
 }
      }
 }
    }

 System.out.println(temp);
    System.out.println(temp);
 return temp.split(","); //以逗号隔开的数组.
    return temp.split(","); //以逗号隔开的数组.
 }
  }

 public Calendar getTime(String timeStr)
  public Calendar getTime(String timeStr)

 
   {
{
 return getTime(format, timeStr);
    return getTime(format, timeStr);
 }
  }


 /** *//**year, month, day, hour, minute,second, millisecond
  /** *//**year, month, day, hour, minute,second, millisecond
 年    月     日    时   分     秒      毫秒
      年    月     日    时   分     秒      毫秒
 这里暂时假设年份都是显示4位数字,月分和天数都是显示不带前置0的形式,
     这里暂时假设年份都是显示4位数字,月分和天数都是显示不带前置0的形式,
 如1998年9月3日,就不显示为98年09月03日,等日后完善。
     如1998年9月3日,就不显示为98年09月03日,等日后完善。
 如果有显示年必须指定年要显示多少位。
     如果有显示年必须指定年要显示多少位。
 假设当前时间是:2002-11-15 20:13:55.359
     假设当前时间是:2002-11-15 20:13:55.359
 用户设置: year年month月day日hour时minute分second秒
     用户设置: year年month月day日hour时minute分second秒
 输出:2002年11月15日 20时13分55秒
     输出:2002年11月15日 20时13分55秒
 用户设置: year年month月day日
     用户设置: year年month月day日
 输出:2002年11月15日
     输出:2002年11月15日
 注意必须用小写的形式,大写的不行,因为用户可能在时间字符串内
   注意必须用小写的形式,大写的不行,因为用户可能在时间字符串内
 也有大小写有区别的其他单词.
   也有大小写有区别的其他单词.
 **/
   **/


 /** *//**
  /** *//**
 如果正确 就返回其出现的位置,如果错误就返回-1.
     如果正确 就返回其出现的位置,如果错误就返回-1.
 */
   */

 public static int isTimestampValid(String timeStr, String element)
  public static int isTimestampValid(String timeStr, String element)

 
   {
{
 //case1:不包含
    //case1:不包含
 int firstIndex = timeStr.indexOf(element);
    int firstIndex = timeStr.indexOf(element);
 if (firstIndex < 0)
    if (firstIndex < 0)

 
     {
{
 return firstIndex;
      return firstIndex;
 }
    }

 //应经包含了一次。
    //应经包含了一次。
 int nextfrom = firstIndex + element.length();
    int nextfrom = firstIndex + element.length();

 //已经到了尽头, 不用再找了。
    //已经到了尽头, 不用再找了。
 if (nextfrom >= timeStr.length())
    if (nextfrom >= timeStr.length())

 
     {
{
 return firstIndex; //element occurs only once in timeStr.
      return firstIndex; //element occurs only once in timeStr.
 }
    }

 int secondIndex = timeStr.indexOf(element, nextfrom);
    int secondIndex = timeStr.indexOf(element, nextfrom);
 if (secondIndex < 0)
    if (secondIndex < 0)

 
     {
{
 return firstIndex; //只出现一次
      return firstIndex; //只出现一次
 }
    }

 if (secondIndex > 0) //包含2次以上。
    if (secondIndex > 0) //包含2次以上。

 
     {
{
 System.out.println("日期的格式设置有误!" + element + "在" + timeStr +
      System.out.println("日期的格式设置有误!" + element + "在" + timeStr +
 "中出现了2次或2次以上,这样无法分辨");
                         "中出现了2次或2次以上,这样无法分辨");
 }
    }
 return -1;
    return -1;
 }
  }

 public static void main(String[] args)
  public static void main(String[] args)

 
   {
{
 TimeFormat timeFormat1 = new TimeFormat();
    TimeFormat timeFormat1 = new TimeFormat();
 Calendar tmp = getTime("year年month月day日", "2005年1月5日");
    Calendar tmp = getTime("year年month月day日", "2005年1月5日");

 if(tmp!=null)
    if(tmp!=null)

 
     {
{
 Timestamp whatTime = new Timestamp(tmp.getTimeInMillis());
      Timestamp whatTime = new Timestamp(tmp.getTimeInMillis());
 System.out.println(whatTime);
      System.out.println(whatTime);
 }
    }
 else
    else

 
     {
{
 System.out.println("error found.");
      System.out.println("error found.");
 }
    }
 }
  }

 }
}posted on 2005-11-28 17:08 
鱼上游 阅读(2716) 
评论(4)  编辑  收藏  所属分类: 
爪哇世界探险