2014-03-13 46 views
2

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

输入日期值:2010-11-29 04:00:00.0
输出日期值:太阳11月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); 
} 
+0

作为一个建议,避免TimeZone库,这是可怕的。使用Joda时间代替 – Anto

+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时间使得即时(DateTime)与该即时(LocalDateTime)的本地表示之间的区别更清楚。

0

该代码只是废话,因为java.util.Date总是格林威治标准时间。它从来不是本地时间戳,所以试图将它从虚构的本地时间戳转换为GMT是概念上的废话。

的初衷可能是误用一个Date作为一种本地时间戳(在矛盾的规范)的是围绕本地时间米利斯瘦包装。请记住以下关系:[UTC-millis] + [offset-millis] = [local-millis]我只用了一个long原语来计算,而不是j.u.Date。

所以你可以看到许多不一致的代码。 newTime变量似乎是一种本地millis,但是被包装成j.u.Date并返回假装转换为GMT的方法的结果(更多混沌几乎是不可能的)。