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



joda中有函数吗?时间验证字符串是否代表正确的时区,如果它不是正确的格式抛出异常?

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

如果ID不能被识别,DateTimeZone.forID()将抛出异常。

这是适当的,如果你试图得到实际的区域-如果你只是试图验证一个ID是否有效,我将使用getAvailableIDs():

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

在避免使用异常进行流控制方面,这是更好的。但是,它们不是等效的——固定偏移的时区id在DateTimeZone.forID()中是有效的,但可能不包括在可用的id集合中。

java.time

下面引用的是来自Joda-Time:

主页的通知

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

使用java.time的解决方案,现代日期-时间API: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
<<p> 在线演示/kbd>

我不推荐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
<<p> 在线演示/kbd>

Trail: Date Time了解更多关于现代日期时间API的信息。


*出于任何原因,如果你必须坚持Java 6或Java 7,你可以使用ThreeTen-Backport,它支持大部分 Java。time功能到Java 6 &7. 如果你正在为一个Android项目工作,你的Android API级别仍然不符合Java-8,检查Java 8+可用的API,通过desugaring和如何在Android项目中使用ThreeTenABP。

您可以像下面这样编写一个函数,而不是使用Joda:

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

相关内容

  • 没有找到相关文章

最新更新