Java DateFormat および SimpleDateFormat が間違った日付を返す
-
19-09-2019 - |
質問
今日は 2010 年 2 月 9 日火曜日ですが、日付を印刷すると間違った日付が表示されます。
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date today = formatter.parse(String.format("%04d-%02d-%02d",
Calendar.getInstance().get(Calendar.YEAR),
Calendar.getInstance().get(Calendar.MONTH),
Calendar.getInstance().get(Calendar.DAY_OF_MONTH)));
System.out.println("Today is " + today.toString());
print 行の結果は次のようになります。「今日は 2010 年 1 月 9 日土曜日 00:00:00 CST」
間違いなく、それは 1 月 9 日土曜日ではなく、2 月 9 日火曜日です。私が何か間違ったことをしていると思うので、誰かがここで何が間違っているのか教えてもらえますか?曜日を手動で設定する必要がありますか?
アップデート
注記:今日は初期化したくないです new Date()
時、分、秒、ミリ秒を次のように初期化したいからです。 0
. 。これは、ユーザーが入力した日付を今日と比較するために必要です。ユーザーが今日の日付を入力し、フォーマッタを使用して Date オブジェクトを構築した場合、今日を次のように初期化すると、 new Date()
そして 2 つの日付を比較します - 今日は 後 ユーザーが選択した日付 (これは正しくありません)。したがって、今日は 1 日の初めに、時/分/秒/ミリ秒を使用せずに初期化する必要があります。
解決
あなたはカレンダーからMONTHフィールドを抽出する場合)(formatter.parseする「2010-01-09」を渡しているので紛らわしい、カレンダーの数ヶ月は、11(12月)まで(1月)0から数えます。
関連 SO質問。
他のヒント
あなたが使用することができJodaTime使用しない場合:
Calendar calendar = Calendar.getInstance();
calendar.set( Calendar.HOUR_OF_DAY, 0 );
calendar.set( Calendar.MINUTE, 0 );
calendar.set( Calendar.SECOND, 0 );
calendar.set( Calendar.MILLISECOND, 0 );
Date today = calendar.getTime();
これは、はるかに効率的で、あなたの文字列フォーマット/解析アプローチよりもエラーが発生しやすい小さいます。
あなたがJodaTimeを使用できる場合は、これは非常に好ましい方法である。
LocalDate date = new DateTime().toLocaleDate();
所属していません StackOverflow