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 }