我想将类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
答案 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
格式化程序相同)。
因此,我提出了两种用于执行自定义格式的方法,都包括在格式化之前转换为另一种时间类型。
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
LocalDateTime
如果您转换为LocalDateTime
,则会丢失所有与时区相关的信息。因此,使用由V
或O
标记构造的格式化程序将引发异常。只需手动将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
。