验证Java中的时区并抛出异常

时间:2013-01-14 19:23:26

标签: java timezone jodatime

joda.time中是否有任何函数验证字符串是否表示正确的时区,如果格式不正确则抛出异常?

我知道TimeZone.getAvalibaleIDs(),但只是想知道是否有任何预定义的功能。

3 个答案:

答案 0 :(得分:6)

如果无法识别ID,

DateTimeZone.forID()将抛出异常。

如果您正在尝试获取实际区域,这是合适的 - 如果您只是尝试验证ID是否有效,我会使用getAvailableIDs():< / p>

boolean valid = DateTimeZone.getAvailableIDs().contains(id);

在避免使用流量控制的异常方面,IMO更好。但是,它们不等于 - 固定偏移时区ID在DateTimeZone.forID()中有效,但可能不包含在可用ID集中。

答案 1 :(得分:1)

java.time

下面引用的是来自 home page of Joda-Time 的通知:

<块引用>

请注意,从 Java SE 8 开始,要求用户迁移到 java.time (JSR-310) - JDK 的核心部分,取代了该项目。

使用现代日期时间 API java.time 的解决方案:try/catch 下处理 ZoneId.of 并捕获无效时区 ID 的异常。

演示:

import java.time.ZoneId;
import java.time.zone.ZoneRulesException;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Stream.of(
                "America/New_York",
                "GMT",
                "UTC",
                "UCT",
                "GMT+01:00",
                "UTC+01:00",
                "ABC"
        ).forEach(s -> {
            try {
                System.out.println(ZoneId.of(s));
            } catch (ZoneRulesException e) {
                System.out.println(e.getMessage());
            }
        });
    }
}

输出:

America/New_York
GMT
UTC
UCT
GMT+01:00
UTC+01:00
Unknown time-zone ID: ABC

ONLINE DEMO

我不推荐ZoneId.getAvailableZoneIds().contains(time-zone-id),因为它在某些情况下可能会失败,如下所示:

import java.time.ZoneId;
import java.util.Arrays;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        String[] arr = { "America/New_York", "GMT", "UTC", "UCT", "GMT+01:00", "UTC+01:00", "ABC" };

        // Alternatively
        Set<String> allZones = ZoneId.getAvailableZoneIds();
        Arrays.stream(arr).forEach(s -> System.out.println(allZones.contains(s) ? s : ("Unknown time-zone ID: " + s)));
    }
}

输出:

America/New_York
GMT
UTC
UCT
Unknown time-zone ID: GMT+01:00
Unknown time-zone ID: UTC+01:00
Unknown time-zone ID: ABC

ONLINE DEMO

Trail: Date Time 了解有关现代 Date-Time API 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

答案 2 :(得分:0)

您可以编写类似于以下的函数,而不使用Joda:

private boolean isTimeZoneValid(String givenTimeZone) {
    Set timeZoneSet = new HashSet(Arrays.asList(TimeZone.getAvailableIDs()));
    return timeZoneSet.contains(givenTimeZone); 
}