我需要获取本地时间和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 1593762925
local 1593762925
调试后,我发现Instant.now()已经是utc。我找不到如何获取当前时区(即我的系统时区)的时间。
我在API中找到了一些解决方案,但出现了错误:
OffsetDateTime utc = time.atOffset(ZoneOffset.of(ZoneOffset.systemDefault().getId()));
线程“主”中的异常java.time.DateTimeException:ZoneOffset的ID无效,格式无效:java.base / java.time.ZoneOffset.of(ZoneOffset.java:241)上的Europe / Astrakhan
UPD:我的问题是如何以秒为单位获取本地时区和UTC的当前时间?即自1970-01-01T00:00:00 GMT + 4和1970-01-01T00:00:00 GMT + 0以来的秒数
UPD2:我有一些设备需要从1970年以秒为单位的utc时间和以秒为单位的发件人本地时间进行响应。为什么?我不知道。对我来说这是黑匣子。
我认为您需要采用Instant
,通过应用来创建ZonedDateTime
(OffsetDateTime
也可能合适)ZoneId.of("UTC")
,然后采用ZonedDateTime
并使用它来改变语言环境:
public static void main(String[] args) {
Instant now = Instant.now();
ZonedDateTime utcZdt = now.atZone(ZoneId.of("UTC"));
ZonedDateTime localZdt = utcZdt.withZoneSameLocal(ZoneId.systemDefault());
System.out.println(utcZdt.toEpochSecond() + " <== " + utcZdt);
System.out.println(localZdt.toEpochSecond() + " <== " + localZdt);
}
在我的系统上,此输出
1593765852 <== 2020-07-03T08:44:12.070Z[UTC]
1593758652 <== 2020-07-03T08:44:12.070+02:00[Europe/Berlin]
两小时的差异正在影响时期秒的第六位数字。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句