現在実行しようとしていることには2つの問題があります。
- コードの2行目にタイプミスがあります。これは、月が分として解析されていることを意味します。
- 前述のように、タイムゾーンを考慮していません。
最初の問題に対処するには、変更する必要があります
Date d2 = new SimpleDateFormat("dd/mm/yyyy").parse(arr[10]);
Date d2 = new SimpleDateFormat("dd/MM/yyyy").parse(arr[10]);
日付形式では大文字と小文字が区別されます。あなたが行おうとしていたのは、月を** M**onthではなく**m**inuteとして解析することです。私が実行したテストでは、すべての月が1月として出てきたことを意味します。これは、あなたの例でも起こっていることがわかります。また、コードの最初の行であるフォーマッター(正しく設定されている)が使用されていないことに気付きました。
2番目の問題は、そうです、JavaのDate
■期待どおりに動作しません。あなたが単に日付のためにそれを気にしないとしても、彼らは時間の要素を持たなければなりません。さらに、時間があるため、タイムゾーンが必要です。
優れたJodaライブラリに移動する選択肢がない場合は、これを回避する方法があります。これを実証するテストを作成しました:
@Test
public void shouldParseDateCorrectly() throws Exception {
// Given
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
format.setTimeZone(TimeZone.getTimeZone("UTC"));
// When
Date parsedDate = format.parse("21/08/2012");
// Then
Assert.assertThat(parsedDate.toString(), is("Tue Aug 21 02:00:00 CEST 2012"));
Assert.assertThat(parsedDate.toGMTString(), is("21 Aug 2012 00:00:00 GMT"));
}
したがって、正しい形式を使用したことがわかりますが、タイムゾーンをUTCに設定しました(オフセットがゼロで、夏時間がありません)。次に、このフォーマッターを使用して日付を解析すると、UTCタイムゾーンの真夜中の時刻で日付が出力されます。私のコンピューターはヨーロッパにあるため、この日付を印刷すると、午前2時と表示されます。これは、このタイムゾーンがUTCより2時間進んでいるためです。しかし、非推奨のtoGMTString
を使用すると 方法では、時間はゼロとして出てきます。
Javaドライバーを使用してこの日付をMongoDBに保存すると、日付だけが気になる場合でも、日付、時刻、およびタイムゾーンが保存されます。日付を読み直すときに行う必要があるのは、日付がUTCであることを覚えて、タイムゾーンを適切に設定することです。
または、タイムゾーンを変更せずにMongoDBに保存することもできます。ただし、常に同じタイムゾーンで読み取りと書き込みを行う必要があります。しかし、これには、a)深夜の時間を処理し、b)夏時間が開始(または停止)するときに、予期しないバグが発生します。
または、Joda-Time を使用してください 。