2010-12-22 70 views
3

我使用GMT-8,GMT,PST,EST等時區字符串構建Java TimeZone對象 這不考慮時區是否啓用夏時制。現在有一個要求包括此檢查,而不是將輸入作爲PDT或EDT進行輸入,而將夏令時作爲單獨的標記給出。我不確定TimeZone是否有直接方法更改該TimeZone的dayLight保存屬性。在Java中構建TimeZone對象

因此,如果我得到像PST和DaylightSaving這樣的輸入爲true,那麼我必須將字符串更改爲PDT。甚至更糟糕的是,有時候我會得到像GMT-8或GMT-6這樣的輸入,並且Day標誌爲真或錯誤。有出路嗎 ?

我不能使用第三方的時區相關的類

代碼示例:

TimeZone timeZone = TimeZone.getTimeZone("EST"); 
TimeZone timeZone = TimeZone.getTimeZone("PST"); 
TimeZone timeZone = TimeZone.getTimeZone("GMT-8"); 
+0

「我不能使用第三方時區有關的類」爲什麼不?特別是當你可以用你的代碼捆綁它們時? – Thilo 2010-12-22 05:14:58

回答

1

我認爲Java是應該由自己搞清楚,時區是否使用夏令時或沒有,當這是活躍的。

因此,如果您嘗試使用該時區格式化某個Date對象,則輸出應反映夏令時。

無論是可靠的工作(考慮到這個領域的頻繁變化),我不知道。您應該更新到最新的JVM以獲取最新的時區數據庫文件(如果您不能這樣做,那麼可以使用separate Time Zone Update tool)。

2

我會補充的唯一的另一件事是使用3個字母的時區標識符已棄用,如下所示從JavaDoc。你需要使用的名稱,如圖here

三字母時區ID

爲了與JDK 1.1.x版本的兼容性,一些 其他三字母時區ID(如 爲「PST」 「CTT」,「AST」)也支持 。然而,它們的使用是 反對,因爲同樣的 的縮寫經常用於 多個時區(例如, 「CST」可以是美國的「中部標準 時間」和「中國標準時間」),並 Java平臺那麼只有 可以識別其中之一。

3

像「PST」和「GMT-8」這樣的時區字符串通常不明確,並且通常不會告訴您夏令時規則是否有效。 (例如,「太平洋標準時間」是指「太平洋標準時間」和「巴基斯坦標準時間」。)

如果你想要得到的時區和夏令時的規則是正確的,你必須採用全時區名獲得TimeZone對象;即表格的名稱:「America/Los_Angeles」。可以使用ISO 8601 date/time values

必須更改大量代碼,並且很難說服其他人獲得批准。

那麼,我會說你在這裏沒有多少選擇...如果你想讓你的代碼獲得時區,等等。

做一些調查研究,瞭解存在的問題,說明這個問題你的老闆/客戶端,讓他們的應用程序不能得到夏令時的權利之間進行選擇,而且採用的是更明智的日期格式,時區規範方法,一個。

1

你並不真正用你展示的例子代碼來「建造」一個時區。您正在獲取已在Java平臺中配置的一個。

而且這些內置TimeZone對象已經具有有關是否使用夏令時的適當信息,何時啓動等等。所有這些都是您提取時區的屬性。

正如另一條評論所述,內置TimeZone對象的這些屬性會隨時變化。對Java運行時的更新會提取這些更改。

如果您確實想真正構建一個新的TimeZone實例,那麼這個子類SimpleTimeZone似乎具有有用的構造函數。但是真的是這樣,你不能使用內置的時區?看起來你正在接受一項比必要更大的工作。 TimeZone.getAvailableIDs()將爲您提供Java運行時中TimeZone名稱的列表。