我有Java 8 Spring web应用程序,将支持多个地区。我需要为客户位置制作日历事件。因此,假设我的web和Postgres服务器托管在MST时区(但我猜如果我们使用云计算,它可能在任何地方)。但客户使用的是EST。因此,根据我读到的一些最佳实践,我认为我应该以UTC格式存储所有日期时间。数据库中的所有日期时间字段都声明为时间戳。
下面是我如何获取LocalDateTime并转换为UTC:
ZonedDateTime startZonedDT = ZonedDateTime.ofLocal(dto.getStartDateTime(), ZoneOffset.UTC, null);
//appointment startDateTime is a LocalDateTime
appointment.setStartDateTime( startZonedDT.toLocalDateTime() );
现在,例如,当搜索日期时,我必须将请求的日期时间转换为UTC,获得结果并转换为用户时区(存储在db中):
ZoneId userTimeZone = ZoneId.of(timeZone.getID());
ZonedDateTime startZonedDT = ZonedDateTime.ofLocal(appointment.getStartDateTime(), userTimeZone, null);
dto.setStartDateTime( startZonedDT.toLocalDateTime() );
现在,我不确定这是正确的方法。我还想知道,因为我要从LocalDateTime到ZonedDateTime,反之亦然,我可能会丢失任何时区信息。
这是我所看到的,在我看来是不正确的。当我从UI接收到LocalDateTime时,我得到的是:
2016-04-04T08:00
ZonedDateTime =
dateTime=2016-04-04T08:00
offset="Z"
zone="Z"
然后,当我将转换后的值赋给我的约会LocalDateTime时,我会存储:
2016-04-04T08:00
我感觉就像是因为我存储在LocalDateTime中,所以我失去了转换为ZonedDateTime的时区。
我应该让我的实体(约会)使用ZonedDateTime而不是LocalDateTime,这样Postgres就不会丢失这些信息吗?
-编辑
在Basils做了出色的回答后,我意识到我可以不关心用户的时区-所有约会都是针对特定位置的,所以我可以将所有日期时间存储为UTC,然后在检索时将它们转换为位置时区。我做了下面的后续question
发布于 2020-09-12 03:15:25
TLDR:
要将以下代码从LocalDateTime转换为ZonedDateTime。您可以使用.atZone( zoneId )
,在TZ database name
on Wikipedia.列中可以找到zoneID的完整列表
LocalDateTime localDateTime = LocalDateTime.parse( "2016-04-04T08:00" );
ZoneId zoneId = ZoneId.of( "UTC" ); // Or "Asia/Kolkata" etc.
ZonedDateTime zdt = localDateTime.atZone( zoneId );
https://stackoverflow.com/questions/36417317
复制相似问题