时区与getRawOffset方法混淆

时间:2014-03-13 11:26:06

标签: java date datetime

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

输入日期值:2010-11-29 04:00:00.0
输出日期值:Sun Nov 28 20:00:00 PST 2010

我的机器在太平洋时区(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);
}

2 个答案:

答案 0 :(得分: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)更清晰。

答案 1 :(得分:0)

代码只是垃圾,因为java.util.Date总是GMT。它永远不是本地时间戳,因此尝试将其从假想的本地时间戳转换为GMT是概念上的无意义。

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

因此,您可以在代码中看到许多不一致的内容。 newTime变量似乎是一种局部毫秒,但是被包装成j.u.Date并返回一个假装转换为GMT的方法的结果(更难以产生混乱)。