当前位置: 首页 > 面试题库 >

Java时区:为什么需要偏移量

闾丘永春
2023-03-14
问题内容

我的要求是这样的:

我在数据库和时区中以毫秒为单位保存时间,例如以毫秒为1223123123232单位的时间
很长,而时区为Asia/Calcutta。我必须将其转换Africa/Asmara为时区。

long l = 1223123123232l;
TimeZone tz = TimeZone.getTimeZone("Asia/Calcutta");
long tzOff = tz.getOffset(l);
java.util.Date d = new Date(l-tzOff);   // WHY THIS??
DateFormat df = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");
df.setTimeZone(TimeZone.getTimeZone("Africa/Asmara"));// required timezone
String s = df.format(d);
System.out.println(s);

要检查我引用此:链接

我的问题是:

  1. 如果时区只是不同格式的时间表示(地理区域偏离GMT),为什么我需要从实际时间中减去偏移时间(l-tzOff)
  2. 为什么我不能忽略保存在数据库中的时区,而只考虑要转换日期的时区?

就像是:

long l = 1223123123232l;
java.util.Date d = new Date(l);
DateFormat df = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");
df.setTimeZone(TimeZone.getTimeZone("Africa/Asmara"));// required timezone
String s = df.format(d);
System.out.println(s);

我的系统时区是Asia/Calcutta,我想将Africa/BujumburaEurope/Vatican区中的日期转换为时区。以上代码在这种情况下不起作用?为什么会这样呢?


问题答案:

Java日期不了解时区。因此,如果我在纽约保存14H00,尽管毫秒值相同,但它将与巴黎的14H00不同。您需要使用唯一的引用来保存日期。人们经常选择GMT
+ 0。

如果您需要检查时区的本地时间,可以使用我在这里开发的工具。

要回答您的问题:

  1. 时区不是时间的表示,而是时间的本地化。要减去偏移量的原因是要确保所有时间都是根据同一参考定义的。
  2. 因为您会得到错误的结果和错误的日期。


 类似资料:
  • 我使用的是“亚洲/曼谷”区域id。该偏移是从格林尼治时间UTC 07:00开始的。 但是当我做了下面的事情时,设置为“01/01/1900 7:00:00.000”时不是7:00 结果就是 周一一月一日07:00:00 ICT 1900 -402 周一一月一日06:00:00 ICT 1900 -420 我想知道偏移量是否在1900年1月1日早上7点左右发生了变化,所以我在维基百科上查了一下。ht

  • 我有一个格式为“2019-04-25T16:34:28-05:00”的字符串。我已经通过模式“yyyy-mm-dd't'hh:mm:ssz”通过joda-time解析了字符串。 它在DateTime中给出的输出是“2019-04-25t15:34:28.000-06:00”。

  • 问题内容: 我对JAX-WS进行了概述,并注意到了(和)的一些引用。 在什么情况下需要?(我认为JSR 109服务器?!) 问题答案: 是使用SUN的参考实现将Web服务作为标准存档部署在非Java EE5 Servlet容器上时所需的专有部署描述符。 Sun的RI 用作servlet上下文事件的侦听器和调度程序servlet。两者都必须在中声明。然后需要该文件为定义Web服务端点,以使其知道必须

  • 问题内容: 我们需要大量的序列化工作,并且必须在使用的每个对象上指定标签,这是一种负担。特别是当它是第三方类时,我们不能真正更改。 问题是:由于是一个空接口,并且Java一旦添加便提供了可靠的序列化 为什么它们不使所有内容都可序列化,仅此而已? 问题答案: 序列化充满陷阱。这种形式的自动序列化支持使类内部成为公共API的一部分(这就是javadoc为你提供类的持久化形式的原因)。 为了实现长期持久