文字列があります。それが標準のタイム ゾーン識別子かどうかを確認する必要があります。どの方法を使用すればよいかわかりません。
String timeZoneToCheck = "UTC";
有効なタイムゾーンを表しているかどうかを確認したいと思います。
文字列があります。それが標準のタイム ゾーン識別子かどうかを確認する必要があります。どの方法を使用すればよいかわかりません。
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");
}
}
これは、考えられるすべての 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
}
次の回避策を提案したいと思います。
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値ハンドラー (ユース ケースに依存)を導入できます- 例外をスロー & など。
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"));
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
}
}