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 ) ;
我正在尝试将值 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 ) ;