如何创建不使用冒号的ISO_INSTANT DateTimeFormatter的自定义变体?

时间:2015-09-21 12:19:13

标签: java java-8 java-time

我想将类java.time.Instant的实例转换为Strings。

我想使用与java.time.format.DateTimeFormatter.ISO_INSTANT完全相同的格式,唯一的区别是格式中的冒号被省略或被点替换,以便可以在不转义文件名和URL的情况下使用它们。

示例:2011-12-03T10.15.30.001Z而不是2011-12-03T10:15:30.001Z

请参阅ISO_INSTANT的Javadoc: https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#ISO_INSTANT

2 个答案:

答案 0 :(得分:2)

您可以像这样构建自己的格式化程序:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH.mm.ss.SSSVV")

DateTimeFormatter Javadoc会列出所有可能的令牌及其含义。

答案 1 :(得分:0)

Instant不能直接用DateTimeFormatter格式化。可以使用String方法将其转换为.toString(),该方法将使用ISO-8601表示形式对其进行格式化(与ISO_INSTANT格式化程序相同)。

因此,我提出了两种用于执行自定义格式的方法,都包括在格式化之前转换为另一种时间类型。

方法1:转换为ZonedDateTime

如果转换为ZonedDateTime,则可以使用Tunaki's answer中建议的格式化程序。

Instant instant = Instant.now();
DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH.mm.ss.SSSVV");

String formatted = ZonedDateTime.ofInstant(instant, ZoneOffset.UTC).format(FORMATTER);
System.out.println(formatted); // 2019-02-25T11.21.23.257Z

方法2:转换为LocalDateTime

如果您转换为LocalDateTime,则会丢失所有与时区相关的信息。因此,使用由VO标记构造的格式化程序将引发异常。只需手动将Z添加到字符串的末尾即可。

Instant instant = Instant.now();
DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH.mm.ss.SSS'Z'");

String formatted = LocalDateTime.ofInstant(instant, ZoneOffset.UTC).format(FORMATTER);
System.out.println(formatted); // 2019-02-25T11.21.23.257Z

使用您喜欢的任何一个。两者都将产生2019-02-25T11.21.23.257Z