Java中的TimeZonevalidation

我有一个字符串,我需要检查它是否是标准的时区标识符。 我不确定我需要使用哪种方法。

String timeZoneToCheck = "UTC"; 

我想检查它是否代表一个有效的时区。

您可以使用getAvailableIDs()获取所有支持的ID

然后循环supportedID数组并与String进行比较。

例:

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

你可以把它写成一行

 public boolean validTimeZone(String timezone) { return Arrays.asList(TimeZone.getAvailableIDs()).contains(timezone); } 

我想提出下一个解决方法:

 public static final String GMT_ID = "GMT"; public static TimeZone getTimeZone(String ID) { if (null == ID) { return null; } TimeZone tz = TimeZone.getTimeZone(ID); // not nullable value - look at implementation of TimeZone.getTimeZone String tzID = tz.getID(); // check if not fallback result return GMT_ID.equals(tzID) && !tzID.equals(ID) ? null : tz; } 

如果时区ID无效或自定义时区无效,您将收到null 。 另外,您可以引入相应的值处理程序(依赖于用例) – 抛出exception等。

 private boolean isValidTimeZone(final String timeZone) { final String DEFAULT_GMT_TIMEZONE = "GMT"; if (timeZone.equals(DEFAULT_GMT_TIMEZONE)) { return true; } else { // if custom time zone is invalid, // time zone id returned is always "GMT" by default String id = TimeZone.getTimeZone(timeZone).getID(); if (!id.equals(DEFAULT_GMT_TIMEZONE)) { return true; } } return false; } 

该方法对以下内容返回true:

 assertTrue(this.isValidTimeZone("JST")); assertTrue(this.isValidTimeZone("UTC")); assertTrue(this.isValidTimeZone("GMT")); // GMT+00:00 assertTrue(this.isValidTimeZone("GMT+0")); // GMT-00:00 assertTrue(this.isValidTimeZone("GMT-0")); // GMT+09:00 assertTrue(this.isValidTimeZone("GMT+9:00")); // GMT+10:30 assertTrue(this.isValidTimeZone("GMT+10:30")); // GMT-04:00 assertTrue(this.isValidTimeZone("GMT-0400")); // GMT+08:00 assertTrue(this.isValidTimeZone("GMT+8")); // GMT-13:00 assertTrue(this.isValidTimeZone("GMT-13")); // GMT-13:59 assertTrue(this.isValidTimeZone("GMT+13:59")); // NOTE: valid time zone IDs (see TimeZone.getAvailableIDs()) // GMT-08:00 assertTrue(this.isValidTimeZone("America/Los_Angeles")); // GMT+09:00 assertTrue(this.isValidTimeZone("Japan")); // GMT+01:00 assertTrue(this.isValidTimeZone("Europe/Berlin")); // GMT+04:00 assertTrue(this.isValidTimeZone("Europe/Moscow")); // GMT+08:00 assertTrue(this.isValidTimeZone("Asia/Singapore")); 

……以下时区错误:

 assertFalse(this.isValidTimeZone("JPY")); assertFalse(this.isValidTimeZone("USD")); assertFalse(this.isValidTimeZone("UTC+8")); assertFalse(this.isValidTimeZone("UTC+09:00")); assertFalse(this.isValidTimeZone("+09:00")); assertFalse(this.isValidTimeZone("-08:00")); assertFalse(this.isValidTimeZone("-1")); assertFalse(this.isValidTimeZone("GMT+10:-30")); // hours is 0-23 only assertFalse(this.isValidTimeZone("GMT+24:00")); // minutes 00-59 only assertFalse(this.isValidTimeZone("GMT+13:60")); 

如果TimeZone.getAvailableIDs()包含有问题的ID,则它是有效的:

 public boolean validTimeZone(String id) { for (String tzId : TimeZone.getAvailableIDs()) { if(tzId.equals(id)) return true; } return false; } 

不幸的是, TimeZone.getTimeZone()方法以静默方式丢弃无效ID并返回GMT:

返回:

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

您可以使用TimeZone.getAvailableIDs()来获取支持的Id列表

 for (String str : TimeZone.getAvailableIDs()) { if(str.equals("UTC")){ //found } } 

由于TimeZone#getTimeZone(String id)返回默认值(如果值无效(而不是返回无效时区)),如果重新解释的值与初始值不匹配,则它无效。

 private static boolean isValidTimeZone(@Nonnull String potentialTimeZone) { // If the input matches the re-interpreted value, then the time zone is valid. return TimeZone.getTimeZone(potentialTimeZone).getID().equals(potentialTimeZone); } 

与循环遍历所有可能的ID相比,这是一种更有效的解决方案。 它检查getTimeZone的输出。

Java Docs(TimeZone#getTimeZone):

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

因此,如果输出是GMT时区,则输入无效,除非输入确切地是“GMT”。

 public static boolean isValidTimeZone(@NonNull String timeZoneID) { return (timeZoneID.equals("GMT") || !TimeZone.getTimeZone(timeZoneID).getID().equals("GMT")); } 

或者,如果要在不调用getTimeZone两次的情况下使用有效时区:

 TimeZone timeZone = TimeZone.getTimeZone(timeZoneToCheck); if(input.equals("GMT") || !timeZone.getID().equals("GMT")) { //TODO Valid - use timeZone } else { //TODO Invalid - handle the invalid input }