首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >LocalDateTime到ZonedDateTime

LocalDateTime到ZonedDateTime
EN

Stack Overflow用户
提问于 2016-04-05 12:46:58
回答 1查看 50.3K关注 0票数 50

我有Java 8 Spring web应用程序,将支持多个地区。我需要为客户位置制作日历事件。因此,假设我的web和Postgres服务器托管在MST时区(但我猜如果我们使用云计算,它可能在任何地方)。但客户使用的是EST。因此,根据我读到的一些最佳实践,我认为我应该以UTC格式存储所有日期时间。数据库中的所有日期时间字段都声明为时间戳。

下面是我如何获取LocalDateTime并转换为UTC:

代码语言:javascript
复制
ZonedDateTime startZonedDT = ZonedDateTime.ofLocal(dto.getStartDateTime(), ZoneOffset.UTC, null);
//appointment startDateTime is a LocalDateTime
appointment.setStartDateTime( startZonedDT.toLocalDateTime() );

现在,例如,当搜索日期时,我必须将请求的日期时间转换为UTC,获得结果并转换为用户时区(存储在db中):

代码语言:javascript
复制
ZoneId  userTimeZone = ZoneId.of(timeZone.getID());
ZonedDateTime startZonedDT = ZonedDateTime.ofLocal(appointment.getStartDateTime(), userTimeZone, null);
dto.setStartDateTime( startZonedDT.toLocalDateTime() );

现在,我不确定这是正确的方法。我还想知道,因为我要从LocalDateTime到ZonedDateTime,反之亦然,我可能会丢失任何时区信息。

这是我所看到的,在我看来是不正确的。当我从UI接收到LocalDateTime时,我得到的是:

代码语言:javascript
复制
2016-04-04T08:00

ZonedDateTime =

代码语言:javascript
复制
dateTime=2016-04-04T08:00
offset="Z"
zone="Z"

然后,当我将转换后的值赋给我的约会LocalDateTime时,我会存储:

代码语言:javascript
复制
2016-04-04T08:00

我感觉就像是因为我存储在LocalDateTime中,所以我失去了转换为ZonedDateTime的时区。

我应该让我的实体(约会)使用ZonedDateTime而不是LocalDateTime,这样Postgres就不会丢失这些信息吗?

-编辑

在Basils做了出色的回答后,我意识到我可以不关心用户的时区-所有约会都是针对特定位置的,所以我可以将所有日期时间存储为UTC,然后在检索时将它们转换为位置时区。我做了下面的后续question

EN

回答 1

Stack Overflow用户

发布于 2020-09-12 03:15:25

TLDR:

要将以下代码从LocalDateTime转换为ZonedDateTime。您可以使用.atZone( zoneId ),在TZ database name on Wikipedia.列中可以找到zoneID的完整列表

代码语言:javascript
复制
LocalDateTime localDateTime = LocalDateTime.parse( "2016-04-04T08:00" );
ZoneId zoneId = ZoneId.of( "UTC" ); // Or "Asia/Kolkata" etc.
ZonedDateTime zdt = localDateTime.atZone( zoneId );
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36417317

复制
相关文章

相似问题

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