2012-09-03 64 views
1

我想以夏令時證明格式保存一些用戶時區。
我的目標是在代碼執行時獲得正確的GMT偏移量。
爲了弄清楚我最好的選擇,我寫了下面:Java TimeZone頭劃傷

ArrayList<String> list = new ArrayList<String>(); 
list.add("EST"); 
list.add("EDT"); 
list.add("America/New_York"); 
long now = System.currentTimeMillis(); 
for(String tzID: list) { 
    TimeZone tz = TimeZone.getTimeZone(tzID); 
    System.out.println(tzID + " now=" + tz.getOffset(now)/3600000 + "/+182=" + tz.getOffset(now + (182 * 86400000))/3600000); 
} 

對於短,給我現在的偏移量和182天
執行的9月3日輸出

EST now=-5/+182=-5 
EDT now=0/+182=0 
America/New_York now=-4/+182=-4 

由於以下幾個原因,這是意想不到的
1)爲什麼America/New_York不給-4/-5?,它不應該是日期敏感嗎?
2)爲什麼EDT == UTC?

回答

3

您遇到的一個問題是182 * 86400000溢出。如果您使用

long now = System.currentTimeMillis(); 
for(String tzID: "EST,EDT,America/New_York".split(",")) { 
    TimeZone tz = TimeZone.getTimeZone(tzID); 
    System.out.println(tz.getDisplayName() + " now=" + tz.getOffset(now)/36e5 
        + "/+182=" + tz.getOffset(now + 182 * 86400000L)/36e5); 
} 

打印

Eastern Standard Time now=-5.0/+182=-5.0 
Greenwich Mean Time now=0.0/+182=0.0 
Eastern Standard Time now=-4.0/+182=-5.0 

如果你看一下Javadoc和源getTimeZone獲取你可以看到

* @return the specified <code>TimeZone</code>, or the GMT zone if the given ID 
* cannot be understood. 

public static synchronized TimeZone getTimeZone(String ID) { 
return getTimeZone(ID, true); 
} 

private static TimeZone getTimeZone(String ID, boolean fallback) { 
TimeZone tz = ZoneInfo.getTimeZone(ID); 
if (tz == null) { 
    tz = parseCustomTimeZone(ID); 
    if (tz == null && fallback) { 
    tz = new ZoneInfo(GMT_ID, 0); 
    } 
} 
return tz; 
} 

總之,EDT不認可,使其成爲GMT。

+0

這就是你感到孤單,因爲問一個愚蠢的問題......謝謝:) – MonoThreaded

+0

它是一個很常見的問題(重新溢出)。這不是一個愚蠢的問題,試試'我該怎麼去'在谷歌,看看它暗示了一個愚蠢的問題:D –

2

我懷疑這是問題:

now + (182 * 86400000) 

括號算術表達式溢出32位。你可能想:

now + (182 * 86400000L) 

然而,仍然假定任何夏令時將應用於大約6個月,這肯定不是在現實世界的情況。例如,查看Sao Paolo time zone,它會在十月和二月切換 - 所以如果您在九月份運行代碼,最終會看到-3/-3。即使對於DST大約每六個月開關一次的時區,您也很可能每年都會發現連續182天沒有發生切換(幾乎可以定義,因爲這個時間略短於半年)。

還不清楚究竟是你想做什麼,但我懷疑你應該真的只是保存時區ID,例如: 「美國/紐約」。幾乎其他任何事情都在尋求麻煩。

+0

America/New_York它會! – MonoThreaded