【问题标题】:Timezone confusion with getRawOffset method时区与 getRawOffset 方法混淆
【发布时间】:2014-03-13 11:26:06
【问题描述】:

我的一个项目实现了以下方法,我正在研究日期问题之一,并试图了解以下将给定日期转换为 GMT 的方法,但与输出混淆。

输入日期值:2010-11-29 04:00:00.0
输出日期值:2010 年 11 月 28 日星期日 20:00:00 PST

我的机器在太平洋时区 (PST) 运行,如果它返回 GMT,我预计“2010-11-29 11:00:00.0”,您能否说明 getRawOffset() 方法的用途和为什么它会返回那个输出?

public static Date convertToGMT(Date date) {
    TimeZone jvmTimeZone = TimeZone.getDefault();
    long newTime = date.getTime() + jvmTimeZone.getRawOffset();

    if (jvmTimeZone.inDaylightTime(date)) {
        newTime = newTime + jvmTimeZone.getDSTSavings();
    }
    return new Date(newTime);
}

【问题讨论】:

  • 作为建议,避免使用 TimeZone 库,这太糟糕了。改用 Joda Time
  • 我的建议不要试图理解这段代码。您应该尝试了解意图或目标是什么,然后从头开始编写新代码。这更容易。

标签: java date datetime


【解决方案1】:

PST 是 UTC-8,因此getRawOffset() 返回一个负值:

2010-11-29 04:00:00.0 + (-8 hours) = 2010-11-28 20:00:00.0

但是,您尝试做的整个事情都是错误的。

Date 代表一个瞬间,即时间线上的一个点,与任何时区无关。因此,将Date 从一个时区转换为另一个时区是没有意义的。 Date 唯一能做的就是将其转换为特定时区的本地日期/时间,反之亦然。

另外我建议你也使用Joda Time。 Jode Time 更清楚地区分瞬间 (DateTime) 和该瞬间的本地表示 (LocalDateTime)。

【讨论】:

    【解决方案2】:

    代码只是废话,因为java.util.Date 始终是格林威治标准时间。它永远不是本地时间戳,因此试图将其从虚构的本地时间戳转换为 GMT 是概念上的废话。

    最初的意图可能是滥用Date 作为一种本地时间戳(与其规范相矛盾),它是本地时间毫秒的薄包装。请记住以下关系:[UTC-millis] + [offset-millis] = [local-millis] 我只会使用 long 原语进行此计算,而不是 j.u.Date。

    因此您可以在代码中看到许多不一致之处。 newTime 变量似乎是一种本地毫秒,但随后被包装为 j.u.Date 并返回假装转换为 GMT 的方法的结果(几乎不可能出现更多混乱)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-23
      • 2015-10-02
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 2012-10-15
      • 1970-01-01
      相关资源
      最近更新 更多