首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将字符串转换为LocalDateTime或ZonedDateTime

将字符串转换为LocalDateTime或ZonedDateTime
EN

Stack Overflow用户
提问于 2022-02-09 20:53:22
回答 2查看 140关注 0票数 3

嗨,我想在java中将字符串值2020-12-16T19:20:30+01:00 UTC转换为LocalDateTimeZonedDateTime

我试过解决办法:

代码语言:javascript
运行
复制
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)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-10 07:51:56

tl;dr

代码语言:javascript
运行
复制
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/ParisAfrica/Tunis

OffsetDateTime

因此,另一个答案关于使用ZonedDateTime 进行解析的建议是错误的,因为没有指示时区。您的输入只有一个偏移量,因此请使用OffsetDateTime

不需要指定格式模式。我们修改的输入符合ISO8601,java.time类在解析/生成字符串时默认使用这些标准格式。

代码语言:javascript
运行
复制
OffsetDateTime odt = OffsetDateTime.parse( input ) ;

LocalDateTime

你问过如何获得LocalDateTime。这个类没有任何偏移量或时区的概念。因此,请注意,如果您从OffsetDateTime转换,您正在丢弃有价值的信息。

所以,虽然我不建议这样做,但下面是代码。

代码语言:javascript
运行
复制
LocalDateTime ldt = odt.toLocalDateTime() ;

ZonedDateTime

你问过如何适应时区。

若要从偏移量调整到时区,只需指定所需的时区。

代码语言:javascript
运行
复制
ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = odt.withZoneSameInstant( z ) ;
票数 2
EN

Stack Overflow用户

发布于 2022-02-10 00:48:59

您的代码有一些错误。我建议您查看一下DateTimeFormatter文档。

  1. YYYY ->这意味着以周为基础的一年,你可以看看here,看看不同年代之间的区别。所以你应该使用yyyy.
  2. DD,->,这意味着一年一天,所以12月16日等于350个。在您的例子中,您想要使用day-of-month.
  3. T dd,'T'
  4. TZD ->没有T的模式,所以您可以把它当作文本来格式化您约会的‘T’
  5. TZD -> --我不知道您在这里尝试使用什么,我也找不到+03:00 UTC的模式,您可以尝试使用O

因此,您的最后一个模式应该是"yyyy-MM-dd'T'HH:mm:ssO"。它不适用于UTC,我在ZoneId列表中找不到它,可能是因为UTC已经是+00:00,所以UTC+01:00等于+01:00E 239

在深入了解了该模式之后,我发现您正在寻找ISO_ZONED_DATE_TIME,因此您只需修改代码如下:

代码语言:javascript
运行
复制
DateTimeFormatter dtf = DateTimeFormatter.ISO_ZONED_DATE_TIME;
final String responseTimeStamp = "2020-12-16T19:20:30+01:00";
ZonedDateTime zdt = ZonedDateTime.parse(responseTimeStamp, dtf);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71056568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档