2014-03-13 70 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的方法的結果(更多混沌幾乎是不可能的)。