DateTimeFormatter类
除了DataFormat和SimpleDateFormat类外,JDK 8在java.time.format包下还提供了一个DateTimeFormatter类,该类也是一个格式化类,其功能相当于DataFormat和SimpleDateFormat的合体,它不仅可以将日期、时间对象格式化成字符串,还能将特定格式的字符串解析成日期、时间对象。
要使用DateTimeFormatter进行格式化或者解析,就必须先获得DateTimeFormatter对象。获取DateTimeFormatter对象有三种方式,具体如下:
● 使用静态常量创建DateTimeFormatter格式器。在DateTimeFormatter类中包含大量的静态常量,如BASIC_ISO_DATE、ISO_LOCAL_DATE、ISO_LOCAL_TIME等,通过这些静态常量都可以获取DateTimeFormatter实例。
● 使用不同风格的枚举值来创建DateTimeFormatter格式器。在FormatStyle类中定义了FULL、LONG、MEDIUM和SHORT四个枚举值,它们表示日期和时间的不同风格。
● 根据模式字符串创建DateTimeFormatter格式器。
了解了DateTimeFormatter的作用及其对象获取方式后,下面分别讲解下如何使用DateTimeFormatter来格式化和解析日期、时间。
1.完成日期、时间格式化
使用DateTimeFormatter将日期、时间格式化为字符串,可以通过以下两种方式:
● 调用DateTimeFormatter的format(TemporalAccessor temporal)方法执行格式化,其中参数temporal是一个TemporalAccessor类型接口,其主要实现类有LocalDate、LocalDateTime。
● 调用LocalDate、LocalDateTime等日期、时间对象的format(DateTimeFormatter formatter)方法执行格式化。
接下来通过一个案例来演示,如何使用DateTimeFormatter来格式化日期、时间,如文件1所示。
文件1 Example28.java
1 import java.time.*;
2 import java.time.format.*;
3 public class Example28 {
4 public static void main(String[] args) {
5 LocalDateTime date = LocalDateTime.now();
6 // 1、使用常量创建DateTimeFormatter
7 System.out.print("使用常量创建DateTimeFormatter:");
8 System.out.println(DateTimeFormatter
9 .ISO_LOCAL_DATE.format(date));
10 // 2、使用Long类型风格的DateTimeFormatter
11 System.out.print("使用Long类型风格的DateTimeFormatter:");
12 DateTimeFormatter dtf = DateTimeFormatter
13 .ofLocalizedDateTime(FormatStyle.LONG);
14 System.out.println(dtf.format(date));
15 // 3、根据模式字符串来创建DateTimeFormatter格式器
16 System.out.print("根据模式字符串来创建DateTimeFormatter:");
17 DateTimeFormatter formatter = DateTimeFormatter
18 .ofPattern("yyyy MM dd HH:mm:ss");
19 // 使用LocalDateTime的format()方法格式化
20 String text = date.format(formatter);
21 // 使用格式化程序解析文本,返回日期时间
22 LocalDateTime parsedDate = LocalDateTime.parse(text, formatter);
23 System.out.println(parsedDate);
24 }
25 }
运行结果如图1所示。
图1 运行结果
文件1中,分别使用三种方式创建了DateTimeFormatter格式器,并使用不同方式创建的格式器对LocalDateTime进行格式化。
2.解析字符串
要使用DateTimeFormatter将指定格式的字符串解析成日期、时间对象,可以通过日期时间对象所提供的parse(CharSequence text, DateTimeFormatter formatter)方法来实现。
下面通过一个具体的案例来演示,如何使用DateTimeFormatter解析日期、时间,如文件2所示。
文件2 Example29.java
1 import java.time.*;
2 import java.time.format.*;
3 public class Example29 {
4 public static void main(String[] args) {
5 // 定义两种日期格式的字符串
6 String str1 = "2018-01-27 12:38:36";
7 String str2 = "2018年01月29日 15时01分20秒";
8 // 定义解析所用的格式器
9 DateTimeFormatter formatter1 = DateTimeFormatter
10 .ofPattern("yyyy-MM-dd HH:mm:ss");
11 DateTimeFormatter formatter2 = DateTimeFormatter
12 .ofPattern("yyyy年MM月dd日 HH时mm分ss秒");
13 // 使用LocalDateTime的parse()方法执行解析
14 LocalDateTime localDateTime1 = LocalDateTime
15 .parse(str1, formatter1);
16 LocalDateTime localDateTime2 = LocalDateTime
17 .parse(str2, formatter2);
18 // 输出结果
19 System.out.println(localDateTime1);
20 System.out.println(localDateTime2);
21 }
22 }
运行结果如图2所示。
图2 运行结果
在文件2中,首先定义了两种日期格式的字符串,然后通过DateTimeFormatter对象定义了解析不同格式字符串的格式器,接下来通过LocalDateTime的parse()方法对字符串进行解析,最后使用输出语句输出解析后的结果。