java - 无法获得 local 和 utc Instant

标签 java timezone-offset

我需要以秒为单位获取本地时间和 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()));

Exception in thread "main" java.time.DateTimeException: Invalid ID for ZoneOffset, invalid format: Europe/Astrakhan at 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 时间和以秒为单位的发件人本地时间响应。为什么?我不知道。对我来说是黑匣子。

最佳答案

我认为你需要接 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]
两个小时的差异正在影响纪元秒的第六位数字。

关于java - 无法获得 local 和 utc Instant,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62711037/

相关文章:

Java获取变量名作为字符串

java - 使用 Joda 处理时区偏移过渡和夏令时

java - 如何从 "timestamp without time zone"字段收集到没有时区的 Java 时间戳

javascript - 将时区设置为 GB 以供所有人查看

javascript toISOString() 忽略时区偏移量

Java 8 日期和时间 : parse ISO 8601 string without colon in offset

java - 将具有底层颜色的 RGBA 转换为 RGB?

java - 如何使我的java代码能够与许多数据库和许多操作系统一起工作?

Java 过滤器和调用计数

JavaFX 和 CSS : Prevent CSS inheritence for inner TabPane