当前位置: 首页 > 知识库问答 >
问题:

Java 8时区,适用于即时通讯。这是错误的

孙嘉
2023-03-14

我有一台linux机器,其时区设置为亚洲/卡塔尔。当我打印的时候。EPOCH with formatter它在瞬间给了我错误的区域信息。现在()区域信息是正确的。下面是我的代码及其输出。谁能帮我一下,为什么会有这种差异?

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获得了0300。EPOCH也是如此。

共有2个答案

杨昆
2023-03-14

在第一次观察中,我认为夏时制的时差发生在1月(冬季)和9月(夏季),但据我所知,卡塔尔现在不使用这种系统

然而,当我们回顾过去时,我们可以发现卡塔尔在1972年7月1日将UTC区域从GST(-04:00)改为AST(-03:00),所以我猜结果是正确的。此信息可能在时区中找到

问题是Windows机器使用当前的卡塔尔UTC,因为基于Windows的平台会跟踪一些历史。在注册表中写入Windows时区可靠吗?。

尉迟鸿熙
2023-03-14

太长别读:你Linux的结果是正确的,和预期的一样。

1970年,卡塔尔与格林尼治标准时间的偏移量为04:00,纪元为1970年1月1日。1972年,卡塔尔将偏移量从04:00改为03:00。资料来源:关于卡塔尔多哈的时区(Ad Dawhah),在时区更改中:下拉选择1970–1979。

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

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

如果它打印Asia/卡塔尔,我的猜测是错误的。如果它打印GMT 03:00之类的东西,我是对的。如果它打印其他东西,我可能会也可能不会。

编辑:更多链接:AST–阿拉伯标准时间(Standard Time)以科威特为例。科威特城多年来的时间变化告诉我们,自1950年以来,科威特也一直处于03:00偏移量。

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

 类似资料:
  • Linux Mint 自带 pidgin,版本是 2.10。 从源码编译 如果想升级到最新版本,或者,因为某些特殊原因导致内置版本的 pidgin 不可使用,就需要考虑从源码开始编译。 特别说明: 手工编译升级 pidgin 和 lync插件 pidpin-sipe 到最新版本之后,开始可以使用,后面不久就莫名其妙的出问题,表现为 pidgin 启动之后无法找到 pidpin-sipe 导致无法支

  • Skype for Linux Alpha 是Skype for Linux 新版本的早期版本。 安装 下载地址: https://go.skype.com/skypeforlinux-64-alpha.deb 完成之后直接右键点击 deb 文件通过 Gdebi package installer 安装。 安装完成之后,在互联网下就可以找到 Skype for Linux Alpha: 这是 ab

  • 本文向大家介绍C# 调用腾讯即时通信 IM的示例,包括了C# 调用腾讯即时通信 IM的示例的使用技巧和注意事项,需要的朋友参考一下 IM SDK API 概述 https://cloud.tencent.com/document/product/269/33543 以上就是C# 调用腾讯即时通信 IM的示例的详细内容,更多关于c# 调用腾讯 im的资料请关注呐喊教程其它相关文章!

  • 软件: Skype: skype For Linux Alpha Pidgin: 支持多协议的即时通讯软件 Lync兼容方案: 用于兼容 Lync 2013 / skype for business

  • 本文向大家介绍Android Easeui 3.0 即时通讯的问题汇总,包括了Android Easeui 3.0 即时通讯的问题汇总的使用技巧和注意事项,需要的朋友参考一下  0、关于注册账号就不用说了。 1、创建应用、获取appkey 0、创建应用 1、填写信息 2、获取appkey 2、集成 0、首先新建一个工程 1、这里主要介绍使用easeui来集成环信的即时通讯功能,需要下载sdk 2、

  • 问题内容: 在2007年,我们改用夏令时的日子发生了变化。在此更改之前,属于DST扩展范围的任何日期都将报告Chrome和Firefox中的时区偏移不正确。就像Firefox和Chrome不用注意DST过去的日子不同。 如果运行以下脚本,它将报告偏移量为240分钟。这是不正确的,它应该报告300分钟。IE10可以正确执行此操作。有人知道解决办法吗? 更新: 这是我刚刚一起学习的一段有趣的代码(请参