【问题标题】:DateTimeFormatter not able to parse String to LocalDateTime [duplicate]DateTimeFormatter 无法将字符串解析为 LocalDateTime [重复]
【发布时间】:2020-02-27 03:11:19
【问题描述】:

我正在尝试从来自另一个系统的字符串创建一个 LocalDateTime 对象(即我没有能力控制它)。 Java 8 的LocalDateTime.parse(String, DateTimeFormatter) 方法无法正确解析我的字符串。日期字符串的一个例子是20190813074127111,我使用的模式是yyyyMMddHHmmssSSS。错误是Text '20190813074127111' could not be parsed at index 0

我已经使用这些字母的文档验证了我的 DateTimeFormatter 模式中的字母是正确的。我在 Stack Overflow 上看到了许多与此非常相似的问题和答案,但没有一个能完全解决我的问题。

我认为this Stack Overflow 与我正在经历的类似,这表示整个字符串可以被评估为一年,因为我在我的模式字符串中使用 yyyy。我尝试将模式修改为yyMMddHHmmssSSSuuMMddHHmmssSSS;在这两种情况下,异常都会更改为Text '20190813074127111' could not be parsed at index 15

我尝试在模式末尾修剪 SSS 并从输入字符串中删除毫秒,并正确创建具有正确日期和时间的 LocalDateTime,但我没有提供毫秒的精度,并且这个用例应该尽可能精确。

因为我是为一家公司做这件事,所以我不得不删除一些细节,但这与我试图完成的用例相同

public class MyClass {
    private static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");

    public LocalDateTime parseStringToDate(String input) {
        return LocalDateTime.parse(input, DATETIME_FORMATTER);
    }
}

【问题讨论】:

    标签: java


    【解决方案1】:

    您需要使用 DateTimeFormatBuilder:

    DateTimeFormatter formatter =
        new DateTimeFormatterBuilder()
            .appendPattern("yyyyMMddHHmmss")
            .appendValue(ChronoField.MILLI_OF_SECOND, 3)
            .toFormatter();
    

    相关帖子:Is java.time failing to parse fraction-of-second?

    【讨论】:

    • 这是正确的做法。请注意,LocalDateTime 执行纳秒而不是像旧的 Date 那样的毫秒
    • 正确,但这就是我们使用复制机制的目的。请标记为重复,而不是在这种情况和类似情况下编写新的重复答案。当引导到我们收集有关此问题的所有信息的地方时,读者会得到更好的帮助。
    • 完美答案。感谢您链接相关帖子,这是我在看到的几个堆栈溢出中没有看到的帖子
    • 提示:(a) 通过在日期部分和一天中的时间部分。 (b) 如果该值代表 UTC 的时刻,则应附加 Z,表示 UTC,发音为“Zulu”。
    猜你喜欢
    • 1970-01-01
    • 2020-07-11
    • 2020-03-22
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多