[英]Java DateTimeFormatter parsing with special characters
我在使用DataTimeFormatter
解析格式为以下格式的日期时间String
时遇到了一些问题:
20200915095318.883[-4:EDT]
我有一个DateTimeFormatter
模式可以生成这种格式,但它不能解析相同的字符串。 该模式是:
yyyyMMddHHmmss.SSS'['x':'z']'
如果还有其他更适合此类需求的用于 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");
}
输出是:
2020-09-15T09:53:18.883-04:00 2020-09-15T09:53:18.883-04:00[America/New_York]
解析为OffsetDateTime
使用偏移量-4
,而解析为ZonedDateTime
使用时区缩写EDT
。 我检查两人是否同意抵消,否则我不知道该相信他们中的哪一个。 在您的示例字符串中,他们确实同意。
我将+Hmm
作为模式传递给appendOffset()
。 其他选项包括+H
、 +H:mm
、 +Hmmss
和+H:mm:ss
。 小写mm
和ss
表示偏移的分钟和秒是可选的。 如果不是整数小时,您应该根据偏移量的外观进行选择。
自 Java 9 以来我的意思是什么? java.time、 DateTimeFormatterBuilder
及其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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.