DateTimeFormatter 字符串到 LocalDateTime

DateTimeFormatter String to LocalDateTime

我正在尝试将值 2022-04-30 14:34:52.900426+00:00 转换为 LocalDateTime 的实例。我写了下面的代码:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS'Z'");

我收到以下错误

could not be parsed at index 26

我的格式化程序字符串应该是什么?

你试过了吗"yyyy-MM-dd HH:mm:ss.SSSSSS+00:00"

它不起作用,因为 UTC 时间偏移没有正确写入。自定义 DateTimeFormatter:

应该是这样的
//Custom DatTimeFormatter
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSZZZZZ");
formatter.parse("2022-04-30 14:34:52.900426+00:00");

您可以使用预定义的 ISO_OFFSET_DATE_TIME DatTimeFormatter 通过将日期和时间之间的 space 替换为大写 T,如standard 需要。

//Predefined DateTimeFormatter
DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse("2022-04-30T14:34:52.900426+00:00");

此外,在@Taco Jan Osinga 的回复下回答你的问题:

不,使用“+00:00”来匹配您尝试解析的日期时间是不正确的。您要构建的自定义 DateTimeFormatter 只会匹配您当地时区的日期时间;因此它不适用于来自不同地区的日期时间。

tl;博士

OffsetDateTime                          // Use `OffsetDateTime`, not `LocalDateTime`, to represent a date with time and offset. 
.parse( 
    "2022-04-30 14:34:52.900426+00:00"  // Almost in ISO 8601 format.
    .replace( " " , "T" )               // Replace SPACE with T to comply with ISO 8691.
) 

看到这个code run live at IdeOne.com

错class,用OffsetDateTime,不是LocalDateTime

LocalDateTime 正是在这种情况下使用的侧翼 class。这代表 time-of-day 的日期。但是您输入的日期显示 time-of-day 和 offset-from-UTC。 +00:00 表示与 UTC 的偏移量为零 hours-minutes-seconds。

因此将该输入解析为 OffsetDateTime 对象。

与其定义格式化模式,我建议仅将中间的 SPACE 替换为 T 以符合 [=32] 中默认使用的 ISO 8601 标准=]java.time class 当 parsing/generating 文本时。

String input = "2022-04-30 14:34:52.900426+00:00".replace( " " , "T" ) ; 
OffsetDateTime odt = OffsetDateTime.parse( input ) ;