我有以下指示:
TimeZone zone = TimeZone.getTimeZone("Asia/Toyo");
显然,它应该返回null,但它将返回默认的timeZone,这不是我的情况所需的行为。来自Java Doc:
如果无法理解给定的ID,则返回指定的
TimeZone
或GMT区域。
如果String没有指示有效的TimeZone,有没有办法获得相应的TimeZone和null值?
我找不到一个很好的解决方案来获取所有TimeZones并迭代它们。
答案 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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 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);
}