繁体   English   中英

Java DateTimeFormatter 使用特殊字符解析

[英]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 小写mmss表示偏移的分钟和秒是可选的。 如果不是整数小时,您应该根据偏移量的外观进行选择。

自 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM