我有以下指令:
TimeZone zone = TimeZone.getTimeZone("Asia/Toyo");
显然,它应该返回null,但它将返回默认的时区,这不是我的情况所期望的行为。来自Java文档:
返回指定的
TimeZone
,如果无法理解给定的ID,则返回GMT区域。
如果字符串没有指示有效的时区,是否有方法获得相应的时区和null值?
我找不到一个好的解决方案来获取所有时区并对其进行迭代。
java.time.ZoneId
旧的日期-时间类现在是遗留的,被java.time类所取代。
应该使用ZoneId
而不是java.util.TimeZone
。要解析正确的时区名称,请调用ZoneId.of
。
ZoneId.of ( "Africa/Casablanca" )
ZoneRulesException
的陷阱
如果传入的名称无法识别,则该方法将抛出一个ZoneRulesException
。
因此,要将Asia/Tokyo
拼错为Asia/Toyo
,请为ZoneRulesException
设置陷阱。
ZoneId z;
try {
z = ZoneId.of ( "Asia/Toyo" ); // Misspell "Asia/Tokyo" as "Asia/Toyo".
} catch ( ZoneRulesException e ) {
System.out.println ( "Oops! Failed to recognize your time zone name. ZoneRulesException message: " + e.getMessage () );
return;
}
ZonedDateTime zdt = ZonedDateTime.now ( z );
请在IdeOne.com上实时查看此代码。
关于java.time
java.time框架是在java 8及更高版本中构建的。这些类取代了诸如java.util.Date
、Calendar
、&SimpleDateFormat
。
JodaTime项目现在处于维护模式,建议迁移到java.Time类。
要了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多示例和解释。规范是JSR310。
从哪里获得java.time类?
- Java SE 8和SE 9及更高版本
- 内置
- 标准Java API的一部分,带有捆绑实现
- Java 9添加了一些小功能和修复程序
- Java SE 6和SE 7
- 大部分java.time功能都是向后移植到Java6&7英寸ThreeTen背包
- 安卓
- ThreeTenABP项目专门为安卓系统改编了ThreeTen Backport(如上所述)
- 请参阅如何使用ThreeTenABP…
ThreeTen Extra项目用额外的类扩展了java.time。这个项目是将来可能添加到java.time的试验场。您可以在这里找到一些有用的类,如Interval
、YearWeek
、YearQuarter
等等。
您也可以简单地使用:
boolean exists = Arrays.asList(TimeZone.getAvailableIDs()).contains("Asia/Toyo");
或:
boolean exists = Arrays.stream(TimeZone.getAvailableIDs()).anyMatch("Asia/Toyo"::equals);
如果您需要经常这样做,那么将可用的ID放入HashSet中会更有效率。
这应该可以满足您在Java 中的时区验证需求
String[] validIDs = TimeZone.getAvailableIDs();
for (String str : validIDs) {
if (str != null && str.equals("yourString")) {
System.out.println("Valid ID");
}
}
只需检查返回的TimeZone
:
public static TimeZone getTimeZone(String timeZoneID) {
TimeZone timeZone = TimeZone.getTimeZone(timeZoneID);
if (timeZone.getID().equals(timeZoneID))
return timeZone;
throw new IllegalArgumentException("Unknown time zone: " + timeZoneID);
}
在Java 8中,使用新的ZoneId.of(String zoneId)
,它将在未知时区失败;如果需要旧的TimeZone
:,则使用TimeZone.getTimeZone(ZoneId zoneId)
ZoneId zoneId = ZoneId.of("Asia/Toyo");
TimeZone timeZone = TimeZone.getTimeZone(zoneId);
如果您不想在TimeZone.getAvailableIDs()上迭代,可以使用。
boolean validateTimeZone(String timeZoneStr) {
return TimeZone.getTimeZone(timeZoneStr).getID().matches(timeZoneStr);
}