我在正确使用格式DataTimeFormatter以解析String以下格式的日期时间时遇到了一些麻烦:
20200915095318.883[-4:EDT]
Run Code Online (Sandbox Code Playgroud)
我有一个DateTimeFormatter模式可以生成这种格式,但它不能解析相同的字符串。该模式是:
yyyyMMddHHmmss.SSS'['x':'z']'
Run Code Online (Sandbox Code Playgroud)
如果还有其他更适合此类需求的用于 DateTime 解析的库,我也会很乐意考虑这些库。现在我的解决方案是一个一次性的正则表达式匹配器,当我遇到这个 DateTime String 并手动构建它的部分时。这很糟糕。
java.time,我认为您已经在使用的现代 Java 日期和时间 API,确实是最适合这项工作的库。这从 Java 9 开始有效:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("uuuuMMddHHmmss")
.appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true)
.appendLiteral('[')
.appendOffset("+Hmm", "+0")
.appendLiteral(':')
.appendZoneText(TextStyle.SHORT)
.appendLiteral(']')
.toFormatter(Locale.ENGLISH);
String s = "20200915095318.883[-4:EDT]";
OffsetDateTime odt = OffsetDateTime.parse(s, formatter);
ZonedDateTime zdt = ZonedDateTime.parse(s, formatter);
if (odt.getOffset().equals(zdt.getOffset())) {
System.out.println(odt);
System.out.println(zdt);
} else {
System.out.println("Something’s wrong here");
}
Run Code Online (Sandbox Code Playgroud)
输出是:
Run Code Online (Sandbox Code Playgroud)2020-09-15T09:53:18.883-04:00 2020-09-15T09:53:18.883-04:00[America/New_York]
解析为 anOffsetDateTime使用偏移量,-4,而解析为 aZonedDateTime使用时区缩写,EDT。我检查两人是否同意抵消,否则我不知道该相信他们中的哪一个。在您的示例字符串中,他们确实同意。
我+Hmm作为模式传递给appendOffset(). 其他选择包括+H,+H:mm,+Hmmss和+H:mm:ss。小写mm和ss平均是分的偏移秒是可选的。如果不是整数小时,您应该根据偏移量的外观进行选择。
自 Java 9 以来我的意思是什么?java.timeDateTimeFormatterBuilder及其appendOffset方法都在 Java 8 中,但只有在 Java 9 中,该方法才接受一个模式,其中只有一位数小时H。
你唯一的问题是-4你的字符串中的 需要一个前导零,正如 @deHaar 在他的评论中指出的那样,即
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss.SSS'['x':'z']'");
LocalDateTime ldt = LocalDateTime.parse("20200915095318.883[-04:EDT]", formatter);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
113 次 |
| 最近记录: |