0%

7.7.8 使用DateFormat格式化日期 时间

7.7.8 使用DateFormat格式化日期 时间

NumberFormat相似的是, DateFormat也是一个抽象类,它也提供了如下几个类方法用于获取DateFormat对象。

方法 描述
getDateInstance() 返回一个日期格式器,它格式化后的字符串只有日期,没有时间。该方法可以传入多个参数,用于指定日期样式和Locale等参数;如果不指定这些参数,则使用默认参数。
getTimeInstance() 返回一个时间格式器,它格式化后的字符串只有时间,没有日期。该方法可以传入多个参数,用于指定时间样式和Locale等参数;如果不指定这些参数,则使用默认参数。
getDateTimeInstance() 返回一个日期、时间格式器,它格式化后的字符串既有日期,也有时间。该方法可以传入多个参数,用于指定日期样式、时间样式和Locale等参数;如果不指定这些参数,则使用默认参数。

上面三个方法可以指定日期样式、时间样式参数,它们是DateFormat的4个静态常量:FULLLONGMEDIUMSHORT,通过这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,分别代表中国、美国
Locale[] locales = {Locale.CHINA, Locale.US};
DateFormat[] df = new DateFormat[16];
// 为上面两个Locale创建16个DateFormat对象
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));
}

// String str1 = "2017/10/07";
// String str2 = "2017年10月07日";
// // 下面输出 Sat Oct 07 00:00:00 CST 2017
// System.out.println(DateFormat.getDateInstance().parse(str2));
// // 下面输出 Sat Oct 07 00:00:00 CST 2017
// System.out.println(DateFormat.getDateInstance(SHORT).parse(str1));
// // 下面抛出 ParseException异常
// System.out.println(DateFormat.getDateInstance().parse(str1));
}
}
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

DateFormat具有国际化能力

正如Number Format提供了国际化的能力一样, DateFormat也具有国际化的能力,同一个日期使用不同的Locale格式器格式化的效果完全不同,格式化后的字符串正好符合Locale对应的本地习惯。

setLenient方法

获得了DateFormat之后,还可以调用它的setLenient(boolean lenient)方法来设置该格式器是否采用严格语法。举例来说,
如果采用不严格的日期语法(该方法的参数为true),对于字符串"2004-2-31"将会转换成2004年3月2日:
如果采用严格的日期语法,解析该字符串时将抛出异常。

字符串转Date对象

DateFormatparse()方法可以把一个字符串解析成Date对象,但它要求被解析的字符串必须符合日期字符串的要求,否则可能抛出ParseException异常。

例如,如下代码片段:

1
2
3
4
5
6
7
8
String str1 = "2017/10/07";
String str2 = "2017年10月07日";
// 下面输出 Sat Oct 07 00:00:00 CST 2017
System.out.println(DateFormat.getDateInstance().parse(str2));
// 下面输出 Sat Oct 07 00:00:00 CST 2017
System.out.println(DateFormat.getDateInstance(SHORT).parse(str1));
// 下面抛出 ParseException异常
System.out.println(DateFormat.getDateInstance().parse(str1));

上面代码中最后一行代码解析日期字符串时引发ParseException异常,因为"2017/10/7"是一个SHORT样式的日期字符串,必须用SHORT样式的DateFormat实例解析,否则将抛出异常。

原文链接: 7.7.8 使用DateFormat格式化日期 时间