だから私はあなたのタイムゾーンを尊重するJavaアプリを持っていますが、いくつかのタイムゾーンに無効な日付があることに気付きました...
私は解析を行うために使用しています...特定のタイムゾーンと日付の組み合わせSimpleDateFormatter('yyyyMMdd')
で失敗することがわかりました。ParseException
内部を調べたところ、Calendar
クラスが . をスローしているため、失敗しているようIllegalArgumentException
です。
私が使用してsetLenient(false)
いるのは、解析で仮定を立てたくないからです。デフォルトの使用setLenient(true)
では、欠落しているフィールドが想定され、IllegalArgumentException
.
なぜこれが機能するのですか:
public void testCalendarPass() {
Calendar cal = Calendar.getInstance();
cal.clear();
cal.setLenient(false);
cal.set(Calendar.YEAR, 1995);
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH,1);
//This call will pass
cal.getTime();
}
パシフィック/キリチマティのこれは失敗しますが:
public void testCalendarFailure() {
Calendar cal = Calendar.getInstance();
cal.clear();
cal.setTimeZone(TimeZone.getTimeZone("Pacific/Kiritimati"));
cal.setLenient(false);
cal.set(Calendar.YEAR, 1995);
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH,1);
//This call will fail
cal.getTime();
}
1995 年 1 月 1 日はキリティマティには存在しませんか? そのギャップ内にある時間をどのように参照しますか?
今のところ、ParseException
解析のためにデフォルトでサーバーのタイムゾーンに遭遇したとき。ただし、これにより最大 24 時間のオフセットが発生します (タイムゾーンによって異なります)。
他のタイムゾーンで失敗する他の日付のリストを次に示します。
19930820 FAILS on Kwajalein
19930820 FAILS on Pacific/Kwajalein
20111230 FAILS on MIT
20111230 FAILS on Pacific/Apia
19950101 FAILS on Pacific/Enderbury
20111230 FAILS on Pacific/Fakaofo
19950101 FAILS on Pacific/Kiritimati