gpt4 book ai didi

Instant.EPOCH 的 Java 8 时区不正确

转载 作者:搜寻专家 更新时间:2023-10-31 19:36:32 24 4
gpt4 key购买 nike

我有一台 linux 机器,它的时区设置为 Asia/Qatar。当我使用格式化程序打印 Instant.EPOCH 时,它会给我错误的区域信息,而 Instant.now() 区域信息是正确的。下面是我的代码及其输出。任何人都可以帮助我,为什么会出现这种差异?

import java.util.Date;
import java.time.format.DateTimeFormatter;
import java.time.Instant;
import java.time.ZoneId;

public class DateTest {
public static void main(String[] args) {
String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS Z";
Instant myInstant = Instant.EPOCH;
Instant myInstantNow = Instant.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern).withZone(ZoneId.systemDefault());
System.out.println(formatter.format(myInstant));
System.out.println(formatter.format(myInstantNow));
}
}

代码的输出是:

1970-01-01T04:00:00.000 +0400
2019-09-29T18:30:14.766 +0300

Java 版本:“1.8.0_181”

如果我在 Windows 中运行相同的代码,它工作正常。我也得到了 Instant.EPOCH 的 +0300。

最佳答案

TL;DR:您在 Linux 上的结果是正确的,符合预期。

1970 年,卡塔尔与 GMT 的偏移量为 +04:00。纪元是 1970 年 1 月 1 日。1972 年,卡塔尔从偏移 +04:00 更改为 +03:00。资料来源:关于 Time Zone in Doha, Qatar (Ad Dawhah) ,在时区更改为:下拉列表中选择 1970–1979。

那么,您的 Windows 计算机出了什么问题?这是我的猜测:我阅读的方式 Default Time Zones在 Windows 文档中,Windows 不提供亚洲/卡塔尔时区作为 Windows 中的设置。所以我的猜测是,根据我刚刚链接到的表格,您的 Windows 设置为阿拉伯标准时间,这又转换为 UTC+03:00。阿拉伯标准时间(或阿拉伯标准时间;缩写为 AST)也用于例如科威特、伊拉克和也门。但这些国家自 1970 年及之前一直处于偏移 +03:00。因此,当 Java 尝试从 Windows 获取默认时区时,它可以轻松获取具有此历史记录的时区,而不是卡塔尔的正确历史记录。正如我所说,现在只是一个猜测。但是你可以很容易地验证。在您的 Windows 计算机上尝试:

    System.out.println(ZoneId.systemDefault());

如果它打印Asia/Qatar,我的猜测是错误的。如果它打印出类似 GMT+03:00 的内容,那么我是对的。如果它打印其他内容,我可能会也可能不会。

编辑:几个进一步的链接:AST – Arabia Standard Time (Standard Time)以科威特为例。 Time Changes in Kuwait City Over the Years告诉我们,科威特自 1950 年以来也一直在偏移 +03:00。

进一步编辑:感谢您确认您的 Windows 计算机上的 Java 打印亚洲/利雅得作为其默认时区。自 1947 年以来,沙特阿拉伯利雅得的偏移量一直为 +03:00。这至少部分解释了为什么你得到这个偏移量,尽管它对卡塔尔来说是不正确的。 Source

关于Instant.EPOCH 的 Java 8 时区不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58156738/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com