相比起早期的Date类对象,Java8新日期时间系统当中的日期时间类对象几乎不需要格式化的操作。如果直接把这些类的对象输出到控制台,基本上所有人都能看得懂这个对象所表示的含义。即便如此,有时候人们还是需要对这些对象进行格式化输出。例如有时候希望能够显示出某个日期对象是星期几,在这几种情况下,直接输出一个日期对象显然不能满足要求。
如果希望格式化Java8新日期时间系统中日期时间类的对象,需要借助DateTimeFormatter类来完成,这个类位于java.time.format包下。DateTimeFormatter类的对象通过ofPattern()静态方法来创建,而格式化操作则由format()方法完成。在创建对象的时候,以字符串参数设定日期时间对象的输出格式。与10.1小节介绍的SimpleDateFormat类一样,DateTimeFormatter类在格式化日期时间对象时也要用到一些有特殊含义的字母,下面的表10-16列出了DateTimeFormatter类中常用特殊字母的含义。
表10-16 DateTimeFormatter类中常用特殊字母含义
字母 | 含义 |
y | 年 |
M | 月 |
d | 日 |
E | 星期 |
H | 以24小时为周期的小时(范围0-23) |
h | 以12小时为周期的小时(范围1-12) |
m | 分钟 |
s | 秒 |
下面的【例10-33】演示了如何使用DateTimeFormatter类格式化日期时间对象。
【例10-33 格式化日期时间对象1】
Exam10_33.java
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class Exam10_33 {
public static void main(String[] args){
DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 EEEE");
DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 EE");
DateTimeFormatter dtf3 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
ZoneId zid = ZoneId.of("Asia/Shanghai");
ZonedDateTime zdt = ZonedDateTime.of(2022,4,15,20,30,45,0,zid);
System.out.println("dtf1的输出格式:"+dtf1.format(zdt));
System.out.println("dtf2的输出格式:"+dtf2.format(zdt));
System.out.println("dtf3的输出格式:"+dtf3.format(zdt));
}
}
【例10-33】用3种格式输出了一个ZonedDateTime类对象。实际上,DateTimeFormatter不仅可以格式化ZonedDateTime的对象,还可以格式化OffsetDateTime、LocaDate、LocalTime以及LocalDateTime类的对象。【例10-33】的运行结果如图10-30所示。
图10-30【例10-33】运行结果
从图10-30可以看出,如果把星期的格式设置为“EEEE”,则输出结果为“星期五”,而把星期的格式设置为“EE”,则输出结果为“周五”。
DateTimeFormatter类还为开发者预设了用于格式化日期时间的对象,这些对象都以静态属性的形式出现在DateTimeFormatter类中,它们可以直接把一个日期时间对象格式化为某种特定格式。下面的表10-17展示了这些对象的格式化效果。
表10-17 预置对象的格式化效果
预置对象 | 格式化效果 |
BASIC_ISO_DATE | 20111203 |
ISO_LOCAL_DATE | 2011-12-03 |
ISO_OFFSET_DATE | 2011-12-03+01:00 |
ISO_DATE | 2011-12-03 |
ISO_LOCAL_TIME | 10:15:30 |
ISO_OFFSET_TIME | 10:15:30+01:00 |
ISO_TIME | 10:15:30+01:00 |
ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30 |
ISO_OFFSET_DATE_TIME | 2011-12-03T10:15:30+01:00 |
ISO_ZONED_DATE_TIME | 2011-12-03T10:15:30+01:00[Europe/Paris] |
ISO_DATE_TIME | 2011-12-03T10:15:30+01:00[Europe/Paris] |
ISO_ORDINAL_DATE | 2012-337 |
ISO_WEEK_DATE | 2012-W48-6 |
ISO_INSTANT | 2011-12-03T10:15:30Z |
RFC_1123_DATE_TIME | Tue, 3 Jun 2008 11:05:30 +0800 |
下面的【例10_34】展示了如何用预置对象格式化日期时间。
【例10-34 格式化日期时间对象2】
Exam10_34.java
import java.time.*;
import java.time.format.DateTimeFormatter;
public class Exam10_34 {
public static void main(String[] args){
DateTimeFormatter dtf1 = DateTimeFormatter.ISO_LOCAL_DATE;
DateTimeFormatter dtf2 = DateTimeFormatter.ISO_DATE_TIME;
DateTimeFormatter dtf3 = DateTimeFormatter.RFC_1123_DATE_TIME;
ZoneId zid = ZoneId.of("Asia/Shanghai");
ZonedDateTime zdt = ZonedDateTime.of(2022,4,15,20,30,45,0,zid);
System.out.println("dtf1的输出格式:"+dtf1.format(zdt));
System.out.println("dtf2的输出格式:"+dtf2.format(zdt));
System.out.println("dtf3的输出格式:"+dtf3.format(zdt));
}
}
【例10_34】的运行结果如图10-31所示。
图10-31【例10_34】运行结果
本文字版教程还配有更详细的视频讲解,小伙伴们可以点击这里观看。