最初に文字列として入ってくる日付から 5 日を差し引こうとしています。
この件に関する他の投稿をいくつか見てきましたが、コードから得られる結果は常に正しくありません。2012-01-01 subtract 5 days gives me 'Jan 27 2012'
主な問題は、たとえば、このコードを使用して、日を差し引いても年の値が変わらないように見えることです。
cal.add(Calendar.DATE, -5);
助けてください。
1
Java では、月が実際には 2月であることをご存知ですか?
Date februaryTheFirst = new Date(2012,1,1); // equals 2012-02-01
これは、あなたが見ているものを説明するかもしれません。代わりに 2012-01-01 をインスタンス化する場合は、次のようにする必要があります。
Date firstDayOf2012 = new Date(2012,0,1); // this is 2012-01-01
を扱うときもまったく同じことが起こりCalendar
ます:
Calendar.getInstance().set(2012,0,1); // 2012-01-01
Date(int, int, int)
およびのドキュメントを確認してくださいCalendar.set(int, int, int)
。また、文字列の解析方法を確認することもできます。を使用するSimpleDateFormat.parse(...)
と、物事が簡単になります。
奇妙ですね。想像してみてください... おもしろい事実として、IntelliJ のドキュメントでは、この 2 番目のパラメーターである month に で注釈を付けて、@MagicConstant
何か非常に奇妙なことが起こっていることをプログラマーに思い出させています。
あなたの実装は正しく、正しい値も取得しています。
Calendar
の月の始まり0
0 = Jan
1 = Feb
5 days
したがって、から 減算すると、2012-01-01
間違いなくJan 27 2012
何かが返されます。これは、Java Calendar で 1 月が 0 であるのはなぜですか?
Calendar.FEBRUARY は、2012 年 2 月 1 日が 2012 年 1 月 27 日の 1 と 5 日前です。
これは私のPCで動作しているコードのセグメントです。まず、カレンダーインスタンスを取得して計算を実行する必要があります。
Calendar cal = Calendar.getInstance();
System.out.println("Today : " + cal.getTime());
// Subtract 300 days from the calendar
cal.add(Calendar.DATE, -300);
System.out.println("300 days ago: " + cal.getTime());
これはあなたが得る出力です:
Today : Wed Oct 17 10:41:23 EET 2012
300 days ago: Thu Dec 22 10:41:23 EET 2011
使用する:
cal.add(Calendar.DAY_OF_MONTH, -5)
編集:申し訳ありません。DAY_OF_MONTH
の同義語DATE
です。1
使用する代わりにCalendar.JANUARY
。