与NumberFormat
相似的是, DateFormat
也是一个抽象类,它也提供了如下几个类方法用于获取DateFormat
对象。
方法 |
描述 |
getDateInstance() |
返回一个日期 格式器,它格式化后的字符串只有日期,没有时间。该方法可以传入多个参数,用于指定日期样式和Locale 等参数;如果不指定这些参数,则使用默认参数。 |
getTimeInstance() |
返回一个时间格式器,它格式化后的字符串只有时间,没有日期。该方法可以传入多个参数,用于指定时间样式和Locale 等参数;如果不指定这些参数,则使用默认参数。 |
getDateTimeInstance() |
返回一个日期、时间格式器,它格式化后的字符串既有日期,也有时间。该方法可以传入多个参数,用于指定日期样式、时间样式和Locale 等参数;如果不指定这些参数,则使用默认参数。 |
上面三个方法可以指定日期样式、时间样式参数,它们是DateFormat
的4个静态常量:FULL
、LONG
,MEDIUM
和SHORT
,通过这4个样式参数可以控制生成的格式化字符串。
示例
看如下例子程序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| import java.util.*; import java.text.*; import static java.text.DateFormat.*;
public class DateFormatTest { public static void main(String[] args) throws ParseException { Date dt = new Date(); Locale[] locales = {Locale.CHINA, Locale.US}; DateFormat[] df = new DateFormat[16]; for (int i = 0 ; i < locales.length ; i++) { df[i * 8] = DateFormat.getDateInstance(SHORT, locales[i]); df[i * 8 + 1] = DateFormat.getDateInstance(MEDIUM, locales[i]); df[i * 8 + 2] = DateFormat.getDateInstance(LONG, locales[i]); df[i * 8 + 3] = DateFormat.getDateInstance(FULL, locales[i]); df[i * 8 + 4] = DateFormat.getTimeInstance(SHORT, locales[i]); df[i * 8 + 5] = DateFormat.getTimeInstance(MEDIUM , locales[i]); df[i * 8 + 6] = DateFormat.getTimeInstance(LONG , locales[i]); df[i * 8 + 7] = DateFormat.getTimeInstance(FULL , locales[i]); } for (int i = 0 ; i < locales.length ; i++) { String tip = i == 0 ? "----中国日期格式----":"----美国日期格式----"; System.out.println(tip); System.out.println("SHORT格式的日期格式:" + df[i * 8].format(dt)); System.out.println("MEDIUM格式的日期格式:" + df[i * 8 + 1].format(dt)); System.out.println("LONG格式的日期格式:" + df[i * 8 + 2].format(dt)); System.out.println("FULL格式的日期格式:" + df[i * 8 + 3].format(dt)); System.out.println("SHORT格式的时间格式:" + df[i * 8 + 4].format(dt)); System.out.println("MEDIUM格式的时间格式:" + df[i * 8 + 5].format(dt)); System.out.println("LONG格式的时间格式:" + df[i * 8 + 6].format(dt)); System.out.println("FULL格式的时间格式:" + df[i * 8 + 7].format(dt)); }
} }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| ----中国日期格式---- SHORT格式的日期格式:2019/10/6 MEDIUM格式的日期格式:2019年10月6日 LONG格式的日期格式:2019年10月6日 FULL格式的日期格式:2019年10月6日星期日 SHORT格式的时间格式:下午4:12 MEDIUM格式的时间格式:下午4:12:39 LONG格式的时间格式:CST 下午4:12:39 FULL格式的时间格式:中国标准时间 下午4:12:39 ----美国日期格式---- SHORT格式的日期格式:10/6/19 MEDIUM格式的日期格式:Oct 6, 2019 LONG格式的日期格式:October 6, 2019 FULL格式的日期格式:Sunday, October 6, 2019 SHORT格式的时间格式:4:12 PM MEDIUM格式的时间格式:4:12:39 PM LONG格式的时间格式:4:12:39 PM CST FULL格式的时间格式:4:12:39 PM China Standard Time
|
正如Number Format
提供了国际化的能力一样, DateFormat
也具有国际化的能力,同一个日期使用不同的Locale
格式器格式化的效果完全不同,格式化后的字符串正好符合Locale
对应的本地习惯。
setLenient方法
获得了DateFormat
之后,还可以调用它的setLenient(boolean lenient)
方法来设置该格式器是否采用严格语法。举例来说,
如果采用不严格的日期语法(该方法的参数为true)
,对于字符串"2004-2-31"
将会转换成2004年3月2日:
如果采用严格的日期语法,解析该字符串时将抛出异常。
字符串转Date对象
DateFormat
的parse()
方法可以把一个字符串解析成Date
对象,但它要求被解析的字符串必须符合日期字符串的要求,否则可能抛出ParseException
异常。
例如,如下代码片段:
1 2 3 4 5 6 7 8
| String str1 = "2017/10/07"; String str2 = "2017年10月07日";
System.out.println(DateFormat.getDateInstance().parse(str2));
System.out.println(DateFormat.getDateInstance(SHORT).parse(str1));
System.out.println(DateFormat.getDateInstance().parse(str1));
|
上面代码中最后一行代码解析日期字符串时引发ParseException
异常,因为"2017/10/7"
是一个SHORT
样式的日期字符串,必须用SHORT
样式的DateFormat
实例解析,否则将抛出异常。