【发布时间】:2020-11-02 20:03:35
【问题描述】:
我正在使用在系统时区返回 Date 的 TrueTime 库。当转换为毫秒时,我无法将此 Date 转换为 UTC 日期。
这是我所做的:
// getting true time in GMT [ex : 2020-07-13T18:00:57.192+03:00 [Europe/Istanbul]]
Date now = getTrueNowTimeInGMT();
// I like to use `LocalDateTime`, so I am converting `Date` to `LocalDateTime`:
LocalDateTime ldtOfSystem = LocalDateTime.ofInstant(now.toInstant(), ZoneId.systemDefault());
// Converting system default zone to UTC
ZonedDateTime zdtOfSystem = ldtOfSystem.atZone(ZoneId.systemDefault());
ZonedDateTime zdtOfSystemInUTC = zdtOfSystem.withZoneSameInstant(ZoneId.of("UTC"));
// Making sure that it is in the UTC. It is returning correct UTC time [ex: 2020-07-13T15:00:57.192 [UTC]]
System.out.println(zdtOfSystemInUTC);
// converting zdtOfSystemInUTC to milliseconds - problem is occurring here!
zdtOfSystemInUTC.toInstant().toEpochMilli();
我正在丢失区域数据,它会根据本地区域(系统区域)返回毫秒数。我再次将这些毫秒转换为日期,结果为 GMT+3 [2020-07-13T18:00:57.192+03:00]
我错过了什么吗?我在一篇文章中读到toInstant() 方法不关心时区。如何从我在ZonedDateTime 中指出的特定时区获取毫秒?
编辑感谢@MenuHochSchild 指出,我更改了变量名(希望改成更好的)。
说明。为什么我需要 UTC 时间?
我无法控制用户的时间。他/她可以轻松更改他/她设备的日期和时间,这给我们带来了麻烦。所以为了解决这个问题,我们找到了一个名为 TrueTime 的库,它提供了这样的实时Date 对象:
Tue Jul 14 00:32:46 GMT+03:00 2020
为了与我们的服务器同步并进行一些与时间相关的操作,我需要将这个Date GMT 转换为UTC 并将其转换为毫秒。
【问题讨论】:
-
您的
ldtInGMT名称不正确,因为它已经是您系统时区中的分区时间戳,而不是 GMT。您的声明returning milliseconds based on the local zone (system zone)是错误的,因为方法toEpochMilli()只返回相对到 UTC。 -
当然,如果您只保存/读取自 Unix 纪元以来的毫秒数(相对于 UTC 区域),那么您自然会丢失区域信息,因为您只保留瞬间/时刻。
-
添加您正在使用的 TrueTime 库的链接。
-
当您说“为什么我需要 UTC 时间?”时,您的意思是“为什么我需要从远程时间服务器获取当前时刻?”
标签: android java-8 java-time java.time.instant