Java:getTimeZone,而不返回默认值



我有以下指令:

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.DateCalendar、&SimpleDateFormat

JodaTime项目现在处于维护模式,建议迁移到java.Time类。

要了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多示例和解释。规范是JSR310。

从哪里获得java.time类?

  • Java SE 8SE 9及更高版本
    • 内置
    • 标准Java API的一部分,带有捆绑实现
    • Java 9添加了一些小功能和修复程序
  • Java SE 6SE 7
    • 大部分java.time功能都是向后移植到Java6&7英寸ThreeTen背包
  • 安卓
    • ThreeTenABP项目专门为安卓系统改编了ThreeTen Backport(如上所述)
    • 请参阅如何使用ThreeTenABP…

ThreeTen Extra项目用额外的类扩展了java.time。这个项目是将来可能添加到java.time的试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter等等。

您也可以简单地使用:

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);
}

相关内容

  • 没有找到相关文章

最新更新