您的位置:

详解Java DateTimeFormatter

一、DateTimeFormatter简介

Java 8新引入的DateTimeFormatter类是Java日期时间API中一个很重要的类,用于格式化和解析日期时间字符串。它可以将日期时间对象格式化为字符串,并将字符串解析为日期时间对象。

在使用DateTimeFormatter类进行日期时间格式化或解析的时候,我们可以通过预定义的DateTimeFormatter常量或自定义模式来指定格式。DateTimeFormatter常量包括ISO、BASIC_ISO_DATE、RFC_1123、ISO_LOCAL_DATE、ISO_LOCAL_TIME、ISO_LOCAL_DATE_TIME、ISO_OFFSET_DATE_TIME、ISO_ZONED_DATE_TIME等。默认情况下,DateTimeFormatter使用ISO_LOCAL_DATE_TIME作为格式。

二、预定义的DateTimeFormatter格式

DateTimeFormatter类定义了一些预定义的格式常量,可以非常方便地将日期、时间和日期时间对象格式化为字符串。下面列举几个常用的DateTimeFormatter格式:

1、ISO_LOCAL_DATE

这个格式用于日期的ISO-8601格式,例如:“2019-12-31”。

LocalDate localDate = LocalDate.of(2019,12,31);
String strDate = localDate.format(DateTimeFormatter.ISO_LOCAL_DATE);
//输出:"2019-12-31"

2、ISO_LOCAL_TIME

这是一个ISO-8601格式的时间格式,例如:“23:59:59.999999999”。

LocalTime localTime = LocalTime.of(23,59,59,999999999);
String strTime = localTime.format(DateTimeFormatter.ISO_LOCAL_TIME);
//输出:"23:59:59.999999999"

3、BASIC_ISO_DATE

这是一个格式化日期的基本ISO格式,例如:"20191231"

LocalDate localDate = LocalDate.of(2019,12,31);
String strDate = localDate.format(DateTimeFormatter.BASIC_ISO_DATE);
//输出:"20191231"

4、ISO_OFFSET_DATE

这是一个ISO-8601格式的日期格式,包括偏移量,例如:“2019-12-31+08:00”。

LocalDate localDate = LocalDate.of(2019,12,31);
ZoneOffset offset = ZoneOffset.ofHours(8);
OffsetDateTime offsetDateTime = OffsetDateTime.of(localDate.atStartOfDay(),offset);
String strDateTime = offsetDateTime.format(DateTimeFormatter.ISO_OFFSET_DATE);
//输出:"2019-12-31+08:00"

三、自定义DateTimeFormatter格式

如果预定义的DateTimeFormatter格式常量不能满足需求,可以自定义DateTimeFormatter格式。

1、通过DateTimeFormatter.ofPattern()方法自定义模式

可以使用DateTimeFormatter.ofPattern()方法来自定义日期、时间或日期时间的格式模式。下面是一些例子:

非常简单的例子:
LocalDateTime localDateTime = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String strDateTime = localDateTime.format(formatter);
//输出:"2022-08-09 09:00:00"
稍微复杂一些的例子:
LocalDatetime localDateTime = LocalDateTime.of(2019, 12, 31, 23, 59, 59, 999999999);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSSSSSSSS");
String strDateTime = localDateTime.format(formatter);
//输出:"2019-12-31 23:59:59.999999999"

2、自定义本地化语言

可以通过withLocale()方法使用不同的本地化语言。

Locale locale = Locale.US;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E MMM dd, yyyy HH:mm:ss").withLocale(locale);
ZonedDateTime zonedDateTime = ZonedDateTime.now();
String strZonedDateTime = zonedDateTime.format(formatter);
//输出:"Tue Aug 09, 2022 09:00:00"

四、解析日期时间字符串

DateTimeFormatter不仅可以格式化日期时间对象为字符串,也可以将字符串解析为日期时间对象。

1、通过ofPattern()进行解析

String strDateTime = "2019-12-31 23:59:59.999999999";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSSSS");
LocalDateTime localDateTime = LocalDateTime.parse(strDateTime, formatter);
//输出:"2019-12-31T23:59:59.999999999"

2、通过定义格式进行解析

如果字符串的日期格式与之前定义的DateTimeFormatter相同,可以使用该DateTimeFormatter解析字符串。

String strDateTime = "2019-12-31T23:59:59.999999999";
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
LocalDateTime localDateTime = LocalDateTime.parse(strDateTime, formatter);
//输出:"2019-12-31T23:59:59.999999999"

五、总结

通过Java 8中引入的DateTimeFormatter,我们可以方便地将日期、时间和日期时间格式化为字符串,并将字符串解析为日期时间对象。除此之外,我们也可以自定义模式和本地化语言,来满足不同的需求。