嗨,我想在java中将字符串值2020-12-16T19:20:30+01:00 UTC
转换为LocalDateTime
或ZonedDateTime
。
我试过解决办法:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("YYYY-MM-DDThh:mm:ssTZD", Locale.ENGLISH);
final String responseTimeStamp = "2020-12-16T19:20:30+01:00 UTC";
ZonedDateTime zdt = ZonedDateTime.parse(responseTimeStamp, dtf);
这给了我错误
线程"main“中的java.base/java.time.format.DateTimeFormatterBuilder.parsePattern(DateTimeFormatterBuilder.java:1815)异常:未知模式字母:t在java.base/java.time.format.DateTimeFormatterBuilder.appendPattern(DateTimeFormatterBuilder.java:1712) at java.base/java.time.format.DateTimeFormatterBuilder.appendPattern(DateTimeFormatterBuilder.java:1712) at java.base/java.time.format.DateTimeFormatter.ofPattern(DateTimeFormatter.java:588) at learning/learning.SpringDemo.main(SpringDemo.java:21)
发布于 2022-02-10 07:51:56
tl;dr
OffsetDateTime
.parse(
"2020-12-16T19:20:30+01:00 UTC"
.replace( " UTC" , "" )
)
.withZoneSameInstant(
ZoneId.of( "America/Edmonton" )
)
ISO 8601
您的输入字符串:
2020-12-16T19:20:30+01:00UTC
…几乎符合ISO 8601标准的数据交换日期-时间格式.要完全遵守,从末尾删除空格和UTC
。结尾的+01:00
意味着“比UTC早一个小时”,所以最后的UTC是多余的。
字符串输入=“2020-12-16T19:20:30+01:00UTC”.replace(“UTC”、"“);
偏移量与时区
解析为OffsetDateTime
,因为您的输入指示来自UTC的小偏移量,而不是时区。
偏移仅仅是比世界协调时的主要经度提前几个小时-分钟-秒/后面。时区更重要。时区是一个历史的过去,现在和未来的变化,以抵消某一特定地区的人民所决定的政治家。时区具有Continent/Region
格式的名称,如Europe/Paris
和Africa/Tunis
。
OffsetDateTime
因此,另一个答案关于使用ZonedDateTime
进行解析的建议是错误的,因为没有指示时区。您的输入只有一个偏移量,因此请使用OffsetDateTime
。
不需要指定格式模式。我们修改的输入符合ISO8601,java.time类在解析/生成字符串时默认使用这些标准格式。
OffsetDateTime odt = OffsetDateTime.parse( input ) ;
LocalDateTime
你问过如何获得LocalDateTime
。这个类没有任何偏移量或时区的概念。因此,请注意,如果您从OffsetDateTime
转换,您正在丢弃有价值的信息。
所以,虽然我不建议这样做,但下面是代码。
LocalDateTime ldt = odt.toLocalDateTime() ;
ZonedDateTime
你问过如何适应时区。
若要从偏移量调整到时区,只需指定所需的时区。
ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = odt.withZoneSameInstant( z ) ;
发布于 2022-02-10 00:48:59
您的代码有一些错误。我建议您查看一下DateTimeFormatter文档。
因此,您的最后一个模式应该是"yyyy-MM-dd'T'HH:mm:ssO"
。它不适用于UTC,我在ZoneId列表中找不到它,可能是因为UTC已经是+00:00,所以UTC+01:00等于+01:00E 239
。
在深入了解了该模式之后,我发现您正在寻找ISO_ZONED_DATE_TIME
,因此您只需修改代码如下:
DateTimeFormatter dtf = DateTimeFormatter.ISO_ZONED_DATE_TIME;
final String responseTimeStamp = "2020-12-16T19:20:30+01:00";
ZonedDateTime zdt = ZonedDateTime.parse(responseTimeStamp, dtf);
https://stackoverflow.com/questions/71056568
复制相似问题