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'");

我得到以下错误

无法解析索引26

格式化器字符串应该是什么?

br

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

查看此代码运行在IdeOne.com。

分类错误,使用OffsetDateTime,而不是LocalDateTime

LocalDateTime正是在这种情况下使用的wing类。它表示带有时间的日期。但是您的输入指示了一个带有时间与utc的偏移量的日期。+00:00表示与UTC的小时-分钟-秒偏移量为0。

所以将输入解析为OffsetDateTime对象。

不定义格式化模式,我建议仅仅用T替换中间的SPACE,以符合java中默认使用的ISO 8601标准。解析/生成文本时计时

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

不工作,因为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_TIMEDatTimeFormatteronly,通过将日期和时间之间的空格替换为大写T,如标准所要求的。

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

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

不,用"+00:00"来匹配你要解析的日期时间。您将构建的自定义DateTimeFormatter将只匹配引用您的本地时区的datetime;因此,它不能与来自不同区域的datetime一起工作。

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

最新更新