joda.time 中是否有任何函数可以验证字符串是否代表正确的时区,如果格式不正确则抛出异常?
我知道 TimeZone.getAvalibaleIDs() 但只是想知道是否有任何预定义的函数。
DateTimeZone.forID()
如果 ID 无法识别,将引发异常。
如果您尝试获取实际区域,这是合适的 - 如果您只是尝试验证 ID 是否有效,我会使用getAvailableIDs()
:
boolean valid = DateTimeZone.getAvailableIDs().contains(id);
这在避免使用异常进行流量控制方面更好,IMO。但是,它们并不等效 - 固定偏移时区 ID 在 中有效DateTimeZone.forID()
,但可能不包含在可用 ID 集中。
请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。
使用java.time
现代日期时间 API 的解决方案:处理并捕获无效时ZoneId.of
区try/catch
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
我不推荐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
从Trail: Date Time了解有关现代日期时间 API 的更多信息。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和 Android API 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaring和How to use ThreeTenABP in Android Project。
您可以编写如下所示的函数,而不是使用 Joda:
private boolean isTimeZoneValid(String givenTimeZone) {
Set timeZoneSet = new HashSet(Arrays.asList(TimeZone.getAvailableIDs()));
return timeZoneSet.contains(givenTimeZone);
}