Java:getTimeZone 不返回默认值

luc*_*uta 5 java timezone

我有以下说明:

TimeZone zone = TimeZone.getTimeZone("Asia/Toyo");
Run Code Online (Sandbox Code Playgroud)

显然,它应该返回 null,但它会返回默认时区,这不是我想要的行为。来自 Java 文档:

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

如果字符串不指示有效的时区,有没有办法获取相应的时区和空值?

我没有找到一个好的解决方案来获取所有时区并迭代它们。

Bas*_*que 5

java.time.ZoneId

旧的日期时间类现在是遗留的,被 java.time 类取代。

相反java.util.TimeZone,您应该使用ZoneId. 要解析正确的时区名称,请调用ZoneId.of.

ZoneId.of ( "Africa/Casablanca" ) 
Run Code Online (Sandbox Code Playgroud)

陷阱 ZoneRulesException

如果您传入的名称无法识别,该方法将抛出一个 ZoneRulesException.

因此,要捕获Asia/Tokyoas的拼写错误,请为.trap 设置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 );
Run Code Online (Sandbox Code Playgroud)

查看此代码在 IdeOne.com 上实时运行


关于 java.time

java.time框架是建立在Java 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

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

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

从哪里获得 java.time 类?

ThreeTen-额外项目与其他类扩展java.time。该项目是未来可能添加到 java.time 的试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多


Flo*_*ian 1

这应该可以满足您在 Java 中进行时区验证的需求

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