爲什麼TimeZone.getTimeZone()方法在給定無效時區ID時會拋出錯誤?相反,如果給定的ID無法被理解,它將返回「GMT時區」。這個決定背後的理由是什麼?爲什麼TimeZone.getTimeZone()拋出異常
回答
我不確定這個原因,但他們確實爲您提供了一個getAvailableIDs()
方法,可以讓您確保您的時區爲vaild。他們在javadoc中提到了這一點:
您可以使用getAvailableIDs方法來遍歷所有支持的時區標識的 。然後你可以選擇一個支持的ID來獲得一個 時區。如果您想要的時區不被 支持的ID之一表示,那麼自定義時區ID可以被指定生產 一個TimeZone
一個爪哇類似這種困境的原因(即一根絕特別注意避免依賴系統的缺省語言環境,字符集和時區,在字符轉換失敗時讀取文本文件或寫入文本文件失敗,因爲磁盤已滿等情況下可能會出現異常)等等)可能是Java was first applied for programming user interfaces,而不是服務器後端:在用戶界面中,顯示錯誤輸出可能比完全失敗更好,因爲用戶通常可以找出錯誤並正確解釋現有輸出。儘管如此,我認爲在TimeZone.getTimeZone(String)
中省略例外是一個設計錯誤。
無論如何,現在有新的更好的API可用。獲得時區(從Java 8開始)的現代方式是
TimeZone.getTimeZone(ZoneId.of(zoneId));
哪個確實會爲無效區域標識引發異常。 ZoneId.of(String)
接受的區域ID格式與TimeZone.getTimeZone(String)
不完全相同,但the Javadoc of ZoneId.of(String)
表示大多數區域ID是兼容的。
以@ Jaan的答案爲基礎,建議使用ZoneId.of()
。這裏有一種方法可以避免ZoneId的ID與TimeZone的ID不完全相同的事實:首先使用TimeZone.getAvailableIDs()
來檢查提供的時區ID是否爲像「Europe/Rome」這樣的字符串,第二次使用ZoneId.of( )如果它是一個固定的偏移ID,否則它是無效的。
/* Returns null if the timezoneID is invalid */
private static TimeZone getTimeZone(String timezoneID) {
final String[] availableTimezoneIDs = TimeZone.getAvailableIDs();
if (! Arrays.asList(availableTimezoneIDs).contains(timezoneID)) {
// Unknown timezone ID, maybe a fixed offset timezone id?
if (timezoneID.equals("Z") ||
timezoneID.startsWith("+") || timezoneID.startsWith("-") ||
timezoneID.startsWith("UTC") || timezoneID.startsWith("UT") || timezoneID.startsWith("GMT")
) {
try {
return TimeZone.getTimeZone(ZoneId.of(timezoneID));
} catch (DateTimeException e) {
// Invalid fixed-offset timezone id
return null;
}
} else
// Not even a fixed offset timezone id
return null;
} else
return TimeZone.getTimeZone(timezoneID);
}
- 1. System.out.println()不拋出異常,但System.in.read()拋出異常,爲什麼?
- 2. 爲什麼拋出異常這麼慢?
- 3. parseuser.SignUpAsync()拋出什麼異常?
- 4. 什麼是拋出異常
- 5. jsoup.element.select()拋出什麼異常?
- 6. Newtonsoft.Json.DeserializeObject拋出什麼異常?
- 7. 爲什麼Boolean.class.newInstance()拋出異常?
- 8. 爲什麼這拋出異常
- 9. 爲什麼BeanUtils.copyProperties會拋出IllegalArgument異常?
- 10. 爲什麼重新拋出異常?
- 11. 爲什麼Assert沒有拋出異常
- 12. Java HSQL爲什麼拋出AbstractMethodError異常?
- 13. 枚舉拋出concurrentModification異常。爲什麼?
- 14. 爲什麼異常不會被拋出?
- 15. 爲什麼拋出空指針異常?
- 16. 爲什麼Exception(str())拋出異常?
- 17. 爲什麼Mockito不會拋出異常?
- 18. 爲什麼Log4Net從不拋出異常
- 19. 爲什麼`JSON.parse`不拋出異常?
- 20. 爲什麼這會拋出異常?
- 21. 爲什麼geoip拋出異常?
- 22. 爲什麼Image.Save(Stream,ImageFormat)拋出異常?
- 23. 爲什麼Matcher.group拋出IndexOutOfBoundsException異常
- 24. 爲什麼Hibernate拋出異常「java.lang.NoSuchMethodError:javax.persistence.UniqueConstraint.name()」?
- 25. JSON和Eclipse - 爲什麼拋出異常?
- 26. 爲什麼會resources.getStringArray(int)拋出異常?
- 27. TweetSharp爲什麼拋出異常?
- 28. 爲什麼GenericObjectPool.addObject拋出檢查異常
- 29. 爲什麼我的NSNotificationCenter拋出異常?
- 30. 爲什麼Java的拋出NumberFormatException異常
還沒有遇到'ZoneId'。看起來很有希望。謝謝! – armandino 2015-03-05 04:53:42