Java:getTimeZone而不返回默认值

时间:2015-10-27 16:31:30

标签: java timezone

我有以下指示:

TimeZone zone = TimeZone.getTimeZone("Asia/Toyo");

显然,它应该返回null,但它将返回默认的timeZone,这不是我的情况所需的行为。来自Java Doc:

  

如果无法理解给定的ID,则返回指定的TimeZone或GMT区域。

如果String没有指示有效的TimeZone,有没有办法获得相应的TimeZone和null值?

我找不到一个很好的解决方案来获取所有TimeZones并迭代它们。

5 个答案:

答案 0 :(得分:2)

而不是迭代,你也可以简单地使用:

boolean exists = Arrays.asList(TimeZone.getAvailableIDs()).contains("Asia/Toyo");

或:

boolean exists = Arrays.stream(TimeZone.getAvailableIDs()).anyMatch("Asia/Toyo"::equals);

如果您需要经常这样做,将可用的ID放在HashSet中会更有效。

答案 1 :(得分:1)

这应该满足您的需求TimeZone validation in Java

String[] validIDs = TimeZone.getAvailableIDs();
for (String str : validIDs) {
      if (str != null && str.equals("yourString")) {
        System.out.println("Valid ID");
      }
}

答案 2 :(得分:1)

java.time.ZoneId

旧的日期时间类现在已经遗留下来,取而代之的是java.time类。

而不是java.util.TimeZone,您应该使用ZoneId。要解析proper time zone name,请致电ZoneId.of。如果您传入的名称无法识别,则该方法会抛出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 );

请参阅此code run live at IdeOne.com

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 3 :(得分:0)

只需查看退回的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);

答案 4 :(得分:0)

如果您不想迭代TimeZone.getAvailableIDs()。你可以使用。

boolean validateTimeZone(String timeZoneStr) {
    return TimeZone.getTimeZone(timeZoneStr).getID().matches(timeZoneStr);
}