import java.util.Calendar;
import java.util.*;
import java.sql.Timestamp;
public class TimeFormat
{
private static String[] keywords =
{
"year", "month", "day", "hour", "minute", "second", "millisecond"};
private String format;
private Calendar whatTime;
public TimeFormat()
{
}
/** *//**
*
* @param format year-month-day hour:minute:second 2005-11-25 22:02
* @param timeStr
* @return
*
* year年month月day日 hour点minute分second秒
* 2005年11月25日 22点22分15秒
* 2005/11/25 22:22
* 05/11/25 22:22
*/
public static Calendar getTime(String format, String timeVarStr)
{
String timeFormatStr = format;
Calendar whatTime = null;
int year = 0, month = 0, day = 0, hour = 0, minute = 0,
second = 0, millisecond = 0;
String[] validTimeElements =
{
"year", "month", "day", "hour", "minute", "second", "millisecond"};
int dateVarCount = 0;
int index = -1;
Vector tmpV = new Vector();
Map map = new HashMap();
for (int i = 0; i < validTimeElements.length; i++)
{
int pos = format.indexOf(validTimeElements[i]);
if(pos>=0)
{
map.put(new Integer(pos),validTimeElements[i]);
}
}
Object[] tmp = map.keySet().toArray();
Integer[] tmpInt = new Integer[tmp.length];
for(int i = 0; i<tmpInt.length;i++)
{
tmpInt[i] = (Integer) tmp[i];
}
//从小到大排序, 还原原来的顺序.
Arrays.sort(tmpInt);
String[] varNames = new String[tmpInt.length];
for(int i=0;i<varNames.length;i++)
{
varNames[i] = (String) map.get(tmpInt[i]);
}
String[] varValue = getTimeInOriginOrder(timeVarStr); //变量值
if(varValue==null)
{
System.out.println("获取时间变量的值出错了.");
return null;
}
int[] timeElementValue = new int[validTimeElements.length];
for(int i=0;i<varNames.length;i++)
{
for(int j=0;j<validTimeElements.length;j++)
{
if(varNames[i].equals(validTimeElements[j]))
{
timeElementValue[j] = Integer.parseInt(varValue[i]);
break;
}
}
}
if(format.indexOf("month")>=0 || format.indexOf("day")>=0)
{
if(format.indexOf("year")<0)
{
System.out.println("没有年, 使用当前的年为缺省值.");
timeElementValue[0] = Calendar.getInstance().get(Calendar.YEAR);
}
//目前禁止年份是非4位数字表示的
String tmpStr = timeElementValue[0]+"";
if(tmpStr.length()<4)
{
System.out.println("目前禁止年份是非4位数字表示的,因为我们无法确定到底是哪一年");
return null;
}
whatTime = Calendar.getInstance();
whatTime.set(timeElementValue[0], timeElementValue[1] - 1,
timeElementValue[2], timeElementValue[3], timeElementValue[4],
timeElementValue[5]);
}
else
{
System.out.println("时间变量获取失败,至少必须又2个时间变量. year,month,day 必须都有, 可以允许year没有使用当前年份");
whatTime = null;
}
return whatTime;
}
/** *//**
* 把时间变量的值按顺序取出,以逗号隔开
* @param val
* @return
*/
static private String[] getTimeInOriginOrder(String val)
{
String temp = "";
String digital = "0123456789";
for (int i = 0; i < val.length(); i++)
{
if (digital.indexOf(val.substring(i, i + 1)) > -1)
{
temp = temp + val.substring(i, i + 1);
}
else
{
if (temp.length()>0 && temp.charAt(temp.length()-1)!=',' )
{
temp = temp + ",";
}
}
}
System.out.println(temp);
return temp.split(","); //以逗号隔开的数组.
}
public Calendar getTime(String timeStr)
{
return getTime(format, timeStr);
}
/** *//**year, month, day, hour, minute,second, millisecond
年 月 日 时 分 秒 毫秒
这里暂时假设年份都是显示4位数字,月分和天数都是显示不带前置0的形式,
如1998年9月3日,就不显示为98年09月03日,等日后完善。
如果有显示年必须指定年要显示多少位。
假设当前时间是:2002-11-15 20:13:55.359
用户设置: year年month月day日hour时minute分second秒
输出:2002年11月15日 20时13分55秒
用户设置: year年month月day日
输出:2002年11月15日
注意必须用小写的形式,大写的不行,因为用户可能在时间字符串内
也有大小写有区别的其他单词.
**/
/** *//**
如果正确 就返回其出现的位置,如果错误就返回-1.
*/
public static int isTimestampValid(String timeStr, String element)
{
//case1:不包含
int firstIndex = timeStr.indexOf(element);
if (firstIndex < 0)
{
return firstIndex;
}
//应经包含了一次。
int nextfrom = firstIndex + element.length();
//已经到了尽头, 不用再找了。
if (nextfrom >= timeStr.length())
{
return firstIndex; //element occurs only once in timeStr.
}
int secondIndex = timeStr.indexOf(element, nextfrom);
if (secondIndex < 0)
{
return firstIndex; //只出现一次
}
if (secondIndex > 0) //包含2次以上。
{
System.out.println("日期的格式设置有误!" + element + "在" + timeStr +
"中出现了2次或2次以上,这样无法分辨");
}
return -1;
}
public static void main(String[] args)
{
TimeFormat timeFormat1 = new TimeFormat();
Calendar tmp = getTime("year年month月day日", "2005年1月5日");
if(tmp!=null)
{
Timestamp whatTime = new Timestamp(tmp.getTimeInMillis());
System.out.println(whatTime);
}
else
{
System.out.println("error found.");
}
}
}
posted on 2005-11-28 17:08
鱼上游 阅读(2700)
评论(4) 编辑 收藏 所属分类:
爪哇世界探险