8.2.7 DateFormat类
在Java中可以使用Date类的对象实例来表示日期和时间。但在国际化程序中,需要按着不同国家和地区的习惯显示日期和时间。java.text.DateFormat类可以用于完成这个工作。DateFormat类是Format类的抽象子类。该类可以将日期和时间按着本地环境进行格式化。
1. 日期和时间的显示模式
在DateFormat类中定义了一些用于描述日期和时间显示模式的int类型常量。这些常量如下:
l DateFormat.SHORT:该常量描述短日期和时间的显示模式。在中文(中国)本地环境下,日期和时间显示为“08-10-17 下午8:54”。在英语(美国)本地环境下,日期和时间显示为“10/17/08 8:54 PM”。
2 DateFormat.MEDIUM:该常量表示默认的日期和时间显示模式。在中文(中国)本地环境下,日期和时间显示为“2008-10-17 20:54:45”。在英语(美国)本地环境下,日期和时间显示为“Oct 17, 2008 8:54:45 PM”。
3 DateFormat.LONG:该常量描述长日期和时间的显示模式。在中文(中国)本地环境下,日期和时间显示为“2008年10月17日 下午08时54分45秒”。在英文(美国)本地环境下,日期和时间显示为“October 17, 2008 8:58:45 PM CST”。
4 DateFormat.FULL:该常量表示显示更长的日期和时间格式。FULL常量除了可以显示和LONG常量同样的日期和时间,还可以显示星期。在中文(中国)本地环境下,日期、星期和时间显示为“2008年10月17日 星期五 下午08时54分45秒 CST”。在英文(美国)本地环境下,日期、星期和时间显示为“Friday, October 17, 2008 8:54:45 PM CST”。
2. 获得DateFormat类的对象实例
DateFormat类的对象实例需要使用DateFormat类的一系列getXxxInstance方法创建。这些getXxxInstance方法分为如下三类:
(1)无参数的getXxxInstance方法。这些方法使用默认的日期/时间显示模式和操作系统的本地信息,包括如下几个方法:
l getInstance():获得日期和时间的显示模式都是SHORT的DateFormat对象。
2 getDateInstance():使用默认的日期显示模式和操作系统的本地信息获得DateFormat对象。该对象实例不处理时间部分。
3 getTimeInstance():使用默认的时间显示模式和操作系统的本地信息获得DateFormat对象。该对象实例不处理日期部分。
4 getDateTimeInstance():使用默认的日期/时间显示模式和操作系统的本地信息获得DateFormat对象。
(2)可设置日期/时间显示模式的getXxxInstance方法。这些方法使用操作系统的本地信息,包括如下几个方法:
l getDateInstance(int style):使用指定的日期显示模式和操作系统的本地信息获得DateFormat对象实例。该对象实例不处理时间部分。
2 getTimeInstance(int style):使用指定的时间显示模式和操作系统的本地信息获得DateFormat对象实例。该对象实例不处理日期部分。
3 getDateTimeInstance(int dateStyle, int timeStyle):使用分别指定的日期和时间显示模式以及操作系统的本地信息获得DateFormat对象。
(3)可设置日期/时间显示模式和操作系统本地信息的getXxxInstance方法。包括如下几个方法:
l getDateInstance(int style, Locale aLocale):使用指定的日期显示模式和本地信息来获得DateFormat对象实例,该对象实例不处理时间部分。
2 getTimeInstance(int style, Locale aLocale):使用指定的时间显示模式和本地信息来获得DateFormat对象实例,该对象实例不处理日期部分。
3 getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale):使用分别指定的日期显示模式、时间显示模式和本地信息获得DateFormat对象实例。
3. 格式化和解析日期/时间
DateFormat类可以将日期/时间对象格式化成本地环境下的字符串,还可以将本地环境下的表示日期/时间的字符串解析成Date对象,以使开发人员不需要考虑各种本地环境下的日期/时间格式。DateFormat类中格式化日期/时间对象的方法是format,该方法的定义如下:
public final String format(Date date);
format方法会根据在创建DateFormat对象时指定的日期、时间显示模式和本地环境来格式化日期/时间对象,如下面的代码所示:
DateFormat df1 = DateFormat.getDateInstance(DateFormat.LONG, Locale.CHINA);
// 使用LONG显示模式和中文(中国)本地环境格式化日期
System.out.println(df1.format(new Date()));
DateFormat df2 = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.US);
// 使用SHORT显示模式和英语(美国)本地环境格式化时间
System.out.println(df2.format(new Date()));
上面代码的输出结果如下:
2008年10月18日
10:18 AM
DateFormat类使用parse方法解析表示日期/时间的字符串。该方法的定义如下:
public Date parse(String source) throws ParseException;
其中source参数表示描述日期/时间的字符串,下面的代码将指定的日期/时间字符串按着指定的显示模式和本地环境解析为Date对象:
DateFormat df1 = DateFormat.getDateInstance(DateFormat.LONG, Locale.CHINA);
// 按着LONG显示模式和中文(中国)本地环境解析日期字符串
Date date1 = df1.parse("2008年8月8日");
DateFormat df2 = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.US);
// 按着SHORT显示模式和英语(美国)本地环境解析时间
Date date2 = df2.parse("8:22 PM");
在默认情况下,如果日期或时间字符串不符合日期或时间的逻辑规则,如2月份是28天或29天,而日期字符串的2月份是30天,或一分钟是60秒,而时间字符串一分钟是70秒。在这种情况下,parse会根据指定的日期和时间向后顺延。如果日期字符串是“2008-2-30”,parse方法解析后的日期是“2008-3-1”。如果时间字符串是“8:99 PM”,parse方法解析后的时间是“9:39 PM”。
如果日期或时间字符串不符合相应的格式,则parse方法会抛出java.text.ParseException异常。虽然象“2008-2-30 8:99PM”这样的日期/时间字符串并不符合正常的日期/时间格式,但parse方法并不会抛出异常,而是向前面的描述一样将日期或时间向后顺延。如果想改变parse方法的这一行为,可以通过DateFormat类的setLenient方法关闭这一特性,代码如下:
DateFormat df = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.US);
df2.setLenient(false);
Date date2 = df.parse("8:99 PM");
上面的代码将抛出java.text.ParseException异常。
除此之外,parse方法还可以指定要解析的日期/时间字符串的开始位置,代码如下:
DateFormat df = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.US);
// 按着SHORT显示模式和英语(美国)本地环境解析时间,从第5个字符开发解析
date = df.parse("abcd8:22 PM", new java.text.ParsePosition(4));
ut.println(date);
上面代码中的表示时间的字符串的前4个字符是“abcd”,显然不符合时间的格式,因此,使用了parse方法的第二个参数指定了解析的位置。如果指定解析位置后,仍然无法成功解析日期/时间字符串,parse方法并不会抛出异常,而是返回null。
4. DateFormat类的其他方法
l setCalendar:该方法设置日期格式使用的日历。
2 getCalendar:该方法返回日期格式使用的日历。
3 setTimeZone:该方法设置DateFormat对象使用的日历的时区。
4 getTimeZone:该方法返回DateFormat对象使用的日历的时区。
5 setNumberFormat:该方法设置DateFormat对象使用的NumberFormat对象。
6 getNumberFormat:该方法返回DateFormat对象使用的NumberFormat对象。