【发布时间】:2020-07-03 08:02:39
【问题描述】:
我需要以秒为单位获取本地时间和 UTC 时间。我在 StackOverflow 中阅读了一些帖子并找到了一些解决方案,如前所述:
Instant time = Instant.now();
OffsetDateTime utc = time.atOffset(ZoneOffset.UTC);
int utcTime = (int) utc.toEpochSecond();
int localTime = (int) time.getEpochSecond();
System.out.println("utc " + utcTime + " local " + localTime);
但结果不是我所期望的。现在是UTC时间。输出:
utc 1593762925
local 1593762925
调试后发现 Instant.now() 已经是UTC。我找不到如何获取当前时区的时间,即我的系统时区。
我在 API 中找到了一些解决方案,但出现错误:
OffsetDateTime utc = time.atOffset(ZoneOffset.of(ZoneOffset.systemDefault().getId()));
线程“main”java.time.DateTimeException 中的异常:ZoneOffset 的 ID 无效,格式无效:Europe/Astrakhan 在 java.base/java.time.ZoneOffset.of(ZoneOffset.java:241)
UPD:我的问题是如何在本地时区和 UTC 中以秒为单位获取当前时间? IE。自 1970-01-01T00:00:00 GMT+4 和 1970-01-01T00:00:00 GMT+0 以来的秒数
UPD2:我有一些设备需要以 1970 年的 UTC 时间(以秒为单位)和发送方本地时间(以秒为单位)进行响应。为什么?我不知道。这对我来说是黑匣子。
【问题讨论】:
-
您为什么期望
localTime是本地的?你正在做getEpochSecond,一个瞬间,无论偏移量如何,都将具有与纪元相同的偏移量。瞬间描述了一个时刻,无论您身在何处。因此,如果您向其添加区域,瞬间本身不会改变。 -
使用
ZonedDateTime sysDefZdt = now.atZone(ZoneOffset.systemDefault());并注意Instant是独立于区域或偏移的时间点。基本上,它只是(毫秒)秒的计数器。您可以花一点时间并以应用区域和/或偏移量的日期时间格式表示它。 -
所以你没想到他们都是
1593762925?你期待什么? “本地时间以秒为单位”是什么意思? -
@ValeriyK。因此,您正在尝试查找自 1970-01-01T00:00:00 GMT+4 以来的秒数?为什么会有用? “1970-01-01T00:00:00 GMT+4”不是时代。这根本不是一个特殊的瞬间。
-
我想你说你想要的是
ZonedDateTime.now().withZoneSameLocal(ZoneOffset.UTC).toEpochSecond()。但我敢肯定你并不是真的想要那个,即这是一个XY problem。如果您能告诉我们更多关于您为什么想要这个“以秒为单位的本地时间”的信息,那就太好了。它有什么用?
标签: java timezone-offset