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

问题描述 投票:6回答:2

我想将类java.time.Instant的实例转换为Strings和来自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

java java-8 java-time
2个回答
2
投票

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

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

DateTimeFormatter Javadoc列出了所有可能的标记及其含义。


0
投票

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

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

Method 1: Convert to a 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

Method 2: Convert to a 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

© www.soinside.com 2019 - 2024. All rights reserved.