15

文字列があります。それが標準のタイム ゾーン識別子かどうかを確認する必要があります。どの方法を使用すればよいかわかりません。

String timeZoneToCheck = "UTC";

有効なタイムゾーンを表しているかどうかを確認したいと思います。

4

9 に答える 9

30

一行で書ける

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);
}
于 2016-08-01T13:11:56.960 に答える
17

getAvailableIDs()を使用して、サポートされているすべての ID を取得できます。

次に、supportedID 配列をループして、文字列と比較します。

例:

String[] validIDs = TimeZone.getAvailableIDs();
for (String str : validIDs) {
      if (str != null && str.equals("yourString")) {
        System.out.println("Valid ID");
      }
}
于 2012-10-26T19:05:19.710 に答える
5

これは、考えられるすべての ID をループするよりも効率的なソリューションです。の出力をチェックしますgetTimeZone

Java ドキュメント (TimeZone#getTimeZone):

戻り値: 指定された TimeZone、または指定された ID を認識できない場合はGMTゾーン。

したがって、出力が GMT タイムゾーンである場合、入力が正確に「GMT」である場合を除いて、入力は無効です。

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

または、2 回呼び出すことなく有効なタイムゾーンを使用する場合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
}
于 2016-12-02T19:29:46.963 に答える
4

次の回避策を提案したいと思います。

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値ハンドラー (ユース ケースに依存)を導入できます- 例外をスロー & など。

于 2013-07-29T14:40:24.557 に答える
3
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"));

...そして、次のタイムゾーンでは false:

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"));
于 2016-08-04T00:56:02.700 に答える
1

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 ゾーン。

于 2012-10-26T19:05:45.197 に答える
1

TimeZone.getAvailableIDs()サポートされているIDのリストを取得するために使用できます

for (String str : TimeZone.getAvailableIDs()) {
    if (str.equals("UTC")) {
        //found
    }
}
于 2012-10-26T19:05:49.547 に答える