JAvaにおけるクラスCalendarのrollとaddの違い


問題発生:電気通信プロジェクトをする時、いつも帳簿期間に基づいて詳細書、通話書などの機能を調べる必要があります.この帳簿期間は、私に難しい問題に直面させました.年越しの時、帳簿期間の日付に問題が発生しました.例えば現在の日付は2002/1/12で、請求書を調べるとき、最新の帳簿日付は2001/12/1-2001/12/31であるべきだが、フロントに出力された帳簿期間は2002/12/1-2002/12/31になった.
問題解決:元のコードは年をまたぐ状況を処理する時、rollの方法を使って1ヶ月後退して、つまり1月を12月に後退して、しかし誰がrollの方法が月だけ後退して、年は変わっていないことを知っていて、これは上述の問題が現れて、実はここでrollの方法を使うのは間違いで、正確にaddの方法を使って月を1後退するべきです.
コードのデモ:
rollメソッドを使用して月を1つ減らします
package test;

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class CalendarTest {
	private static final SimpleDateFormat sdf_bed = new SimpleDateFormat("yyyy/MM/dd");
	
	public static void main(String[] args){
		Calendar cal = Calendar.getInstance();
		cal.set(2002,Calendar.JANUARY,12);
		System.out.println("    :"+sdf_bed.format(cal.getTime()));
		cal.roll(Calendar.MONTH,-1);
//		cal.add(Calendar.MONTH,-1);
		System.out.println("      :"+sdf_bed.format(cal.getTime()));
	}
}

出力結果:
現在の日付:2002/01/12
会計期間の生成日:2002/12/12
addメソッドを使用して月を1つ減らします
package test;

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class CalendarTest {
	private static final SimpleDateFormat sdf_bed = new SimpleDateFormat("yyyy/MM/dd");
	
	public static void main(String[] args){
		Calendar cal = Calendar.getInstance();
		cal.set(2002,Calendar.JANUARY,12);
		System.out.println("    :"+sdf_bed.format(cal.getTime()));
//		cal.roll(Calendar.MONTH,-1);
		cal.add(Calendar.MONTH,-1);
		System.out.println("      :"+sdf_bed.format(cal.getTime()));
	}
}

出力結果:
現在の日付:2002/01/12
会計期間の生成日:2001/12/12
明らかにadd法を使って私たちが望んでいる月を手に入れた.