我试图将值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_TIME
DatTimeFormatter
only,通过将日期和时间之间的空格替换为大写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"
吗?