3

読んだところ、基本的に、Calendarオブジェクトは次のようなものを使用して指定された日付に1か月を追加できることがわかりました。

Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, 1);

日付が30または31の場合の動作は気に入らないのですが、2012年1月31日に1か月を追加すると、出力は2012年2月29日になります。さらに1か月追加すると、2012年3月29日となります。

とにかく、2012年2月29日を2012年3月1日に自動的に強制することはできますか?

基本的にこれは私が起こりたいことです:

デフォルトの日付:2012年1月31日

1か月追加:2012年3月1日

さらに1か月追加:2012年3月31日

4

3 に答える 3

3

求めているのは、開始日がその月の最終日であり、1か月を追加すると、結果は翌月の最終日になるという暗黙知です。つまり、プロパティ「月の最終日」はスティッキーである必要があります。

これはJavaで直接利用することはできませんが、考えられる解決策の1つは、月をインクリメントした後に日をリセットするCalendarために使用することです。Calendar.getActualMaximum(Calendar.DAY_OF_MONTH)

Calendar cal = ...;
cal.add(Calendar.MONTH,1);
cal.set(Calendar.DAY_OF_MONTH,cal.getActualMaximum(Calendar.DAY_OF_MONTH));

サブクラスGregorianCalendar化してメソッドを追加することもできます

public Calendar endOfNextMonth() { ... }

操作をカプセル化します。

于 2013-03-26T04:17:27.453 に答える
3

30日間追加すると、次のようなことができます。

public static java.sql.Date sumarFechasDias(java.sql.Date fch, int days) {
    Calendar cal = new GregorianCalendar();
    cal.setTimeInMillis(fch.getTime());
    cal.add(Calendar.DATE, days);
    return new java.sql.Date(cal.getTimeInMillis());
}

days = 30の場合、30日が追加された日付が返されます。

于 2013-03-26T11:42:50.383 に答える
0

翌月の日付が前月の日付よりも小さい場合は、カレンダーを翌月の初めにロールアップするように見えます。これを行う方法は次のとおりです。

Calendar cal = Calendar.getInstance();
int oldDay = cal.get(DAY_OF_MONTH);
cal.add(Calendar.MONTH, 1);

// If the old DAY_OF_MONTH was larger than our new one, then
// roll over to the beginning of the next month.
if(oldDay > cal.get(DAY_OF_MONTH){
  cal.add(Calendar.MONTH, 1);
  cal.set(Calendar.DAY, 1);
}
于 2013-03-26T04:30:26.897 に答える