Calendarの基本とTips。

基本

溢れても繰り上がらない

例えば1月31日の1ヶ月後は何月何日を考えると、
単純に月を+1すると2月31日になり
カレンダー上存在しない日となってしまう。

この場合Calendarクラスでは再計算が行われる。
くわしい方法はJavaDocにある。

基本的な考えは、
溢れた部分が繰り上がるのではなく、最大値まで削られる。

例.溢れがからむ日付演算
//2012年1月31日の1ヶ月後
Calendar calendar1 = new GregorianCalendar(2011, Calendar.JANUARY, 31);
calendar1.add(Calendar.MONTH, 1); //「2011年2月28日」になる
  
 //2012年1月31日の2ヶ月前
Calendar calendar2 = new GregorianCalendar(2011, Calendar.JANUARY, 31);
calendar2.add(Calendar.MONTH, -2); //「2010年11月30日」になる

Tips

月末日を求める

月末日はその月によって異なる。
また、うるう年によっても異なることもある。

よって、手計算で月末日を求めるのはただ面倒なだけ。

CalendarではgetActualMaximum()をうまく利用することで
簡単に取得することができます。

Calendar calendar = new GregorianCalendar(2012, Calendar.FEBRUARY, 10);
  
int endDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); //日付フィールドの最大値を取得する
calendar.set(Calendar.DAY_OF_MONTH, endDay);                   //この最大値は年月を考慮したもになっている
  
log.debug(calendar.getTime().toString()); //2012年はうるう年なので「2012.02.29」になる

PR