4

だから私はあなたのタイムゾーンを尊重する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
4

2 に答える 2

1

それは、キリマティが 1 月 1 日に 24 時間シフトを被ったためです。The Republic of Kiribati, in the Central Pacific, introduced a change of date for its eastern half on 1 January 1995, from time zones UTC−11 and UTC−10 to UTC+13 and UTC+14. Before this, the country was divided by the IDL. After the change, the IDL in effect moved eastwards to go around this country. http://en.wikipedia.org/wiki/International_Date_Line#Eastern_Kiribati .

また、私は Apia を見てみましたが、次のようです: At 0000 local 30 December 2011 the clocks were moved 24 hours ahead http://en.wikipedia.org/wiki/Apia

したがって、明らかにこれら 2 つの日付は、24 時間シフトのため、それぞれのタイムゾーンのカレンダーには実際には存在しません。それは他のすべての人に当てはまるかもしれません。

于 2013-09-19T21:08:25.673 に答える
0

編集: Java は「Pacific/Kiritimati」の意味を認識していないと当初考えていました。しかし、そうであることがわかりました。Java が認識するすべての文字列のリストを取得するには、次を使用します。

Set<String> ids = new TreeSet<String>();
for (String id : TimeZone.getAvailableIDs())
   ids.add(id);
for (String id : ids)
  System.out.println(id);
于 2013-09-19T21:06:33.393 に答える