一、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,我们可以方便地将日期、时间和日期时间格式化为字符串,并将字符串解析为日期时间对象。除此之外,我们也可以自定义模式和本地化语言,来满足不同的需求。