首页 > 解决方案 > 使用 DateTimeFormatter 将字符串解析为 LocalDateTime 失败

问题描述

我正在尝试使用 DateTimeFormatter 和 LocalDateTime 将一个简单的字符串 [08/May/2020:09:14:05 +0000] 解析为 LocalDateTime 但它似乎由于某些原因不起作用。我尝试了对格式的不同更改,例如 DD、hh、X、x 或 Z,但它不起作用。

这是代码:

String log = "[08/May/2020:09:14:05 +0000]";
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("[d/MMM/yyyy:HH:mm:ss x]");
LocalDateTime odt = LocalDateTime.parse(log, fmt);
System.out.println(odt);

有什么猜测吗?

标签: javadatedatetimedatetime-parsing

解决方案


所有功劳归于安德烈亚斯。他在评论中的建议足以作为答案发布。

    String log = "[08/May/2020:09:14:05 +0000]";
    DateTimeFormatter fmt = DateTimeFormatter.ofPattern("'['dd/MMM/uuuu:HH:mm:ss xx']'", Locale.US);
    LocalDateTime odt = LocalDateTime.parse(log, fmt);
    System.out.println(odt);

输出是:

2020-05-08T09:14:05

在格式模式字符串中,方括号[](通常)用于包含格式的可选部分。由于您要指定文字方括号位于日期时间字符串中,因此请将它们括在格式模式字符串中的撇号中。这取消了括号的含义。

xx用于 UTC 偏移量,小时和分钟不带冒号,例如+0000.

最后,当字符串包含区域设置敏感部分(例如月份缩写)时,始终指定区域设置。在这种情况下,我认为任何说英语的语言环境都可以使用,包括Locale.ENGLISHLocale.ROOTLocale.UKLocale.US许多其他语言环境。


推荐阅读