Java中的时区验证



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

String timeZoneToCheck = "UTC";

我想检查它是否表示有效时区。

您可以在一行中写下它

public boolean validTimeZone(String timezone) {
    return Set.of(TimeZone.getAvailableIDs()).contains(timezone);
}

另外,您可以为其制作一个静态字段

private static final Set<String> TIMEZONES = Set.of(TimeZone.getAvailableIDs())
public boolean validTimeZone(String timezone) {
    return TIMEZONES.contains(timezone);
}

您可以使用getavailableIds()

获得所有受支持的ID

然后循环supportedId数组并与您的字符串进行比较。

示例:

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

java.time.ZoneId

很简单,只需使用ZoneId.of("Asia/Kolkata")

try {
    ZoneId.of("Asia/Kolkataa");
} catch (Exception e) {
    e.printStackTrace();
}

如果您的插入无效时区将抛出异常

**java.time.zone.ZoneRulesException: Unknown time-zone ID: Asia/Kolkataa**

这是一个更有效的解决方案,而不是通过所有可能的ID循环。它检查getTimeZone的输出。

java docs(时区#gettimezone):

返回:指定的时区或 GMT 区域如果给定ID无法理解。

因此,如果输出是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(timeZoneToCheck.equals("GMT") || !timeZone.getID().equals("GMT")) {
    // TODO Valid - use timeZone
} else {
    // TODO Invalid - handle the invalid input
}

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

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 。此外,您可以介绍相应的 null 值处理程序(用例依赖) - 抛出异常&amp;等。

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;
}

该方法返回以下内容:

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#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);
}

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

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

如果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:

返回:

如果不能理解给定的ID,则指定的时区或GMT区域。

相关内容

  • 没有找到相关文章

最新更新