为什么TimeZone.getTimeZone()没有抛出异常

时间:2013-03-20 20:31:48

标签: java timezone

如果给出无效的时区ID,为什么TimeZone.getTimeZone()方法不会抛出错误?相反,如果无法理解给定的ID,则返回“GMT区域”。这个决定背后的理由是什么?

3 个答案:

答案 0 :(得分:2)

我不确定理由,但他们确实为您提供了getAvailableIDs()方法,以确保您的时区有效。他们确实在javadoc中提到了这个:

  

您可以使用getAvailableIDs方法迭代所有   支持的时区ID。然后,您可以选择支持的ID来获取   时区。如果您想要的时区不是由其中一个表示的   支持的ID,然后可以指定生成自定义时区ID   一个TimeZone

答案 1 :(得分:1)

Java的一个原因和类似的问题(必须特别注意避免依赖系统的默认语言环境,字符集和时区,以便在读取文本文件或写入文本文件时字符转换失败时获得异常因为磁盘已满(等等)可能是Java was first applied for programming user interfaces,而不是服务器后端:在UI中,显示错误输出可能比完全失败更好,因为用户通常可以找出错误并解释现有错误输出正确。不过,我认为TimeZone.getTimeZone(String)中遗漏例外是设计错误。

无论如何,现在有新的更好的API可用。获得时区(从Java 8开始)的现代方法是

TimeZone.getTimeZone(ZoneId.of(zoneId));

会为无效的区域ID引发异常。 ZoneId.of(String)接受的区域ID格式与TimeZone.getTimeZone(String)的格式不完全相同,但正如the Javadoc of ZoneId.of(String)所述,大多数区域ID都是兼容的。

答案 2 :(得分:0)

在@ 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);

}