月曜日, 4月 29, 2013

Commons IO DateUtils

Yoda Timeの影に隠れて

Commons IOの中に,探してみればあった, DateUtils.
決して悪くはないが,JodaTimeがある以上無理して使うまでもないだろう..とは思うが,とりあえず私たちのツールボックスの内に加えておいて損はない,ということでご紹介.

とりあえず便利

DateUtilsのJavaDocはこちらのとおり.
とりあえず加減算可能なset シリーズ ( setDays(), setYears() etc. ), 面倒なCalendarのインスタンスを省略できるtoCalendar(), 指定したフィールド以下を0にセットするtruncate()あたりが一番役立つと考えられる.iterator()もカレンダーアプリ関連で役立つかもしれない.

サンプルコード

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

import org.apache.commons.lang3.time.DateUtils;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;

import static org.hamcrest.CoreMatchers.*;

public class DateUtilTest {

 private Date date;
 
 @Before
 public void init() {

  Calendar cal = Calendar.getInstance();
  cal.set( Calendar.YEAR, 1980 );
  cal.set( Calendar.MONTH, 0 );
  cal.set( Calendar.DAY_OF_MONTH, 2 );
  cal.set( Calendar.HOUR_OF_DAY,  5 );
  cal.set( Calendar.MINUTE,  20 );
  cal.set( Calendar.SECOND,  30 );
  cal.set( Calendar.MILLISECOND,  790 );
  date = cal.getTime();
  
 }
 
 @Test
 public void testAddAndSubtract() {

  Calendar cal = Calendar.getInstance();
  cal.setTime( DateUtils.addDays( date, 4 ) );
  assertThat( cal.get( Calendar.DAY_OF_MONTH ), is( 6 ) );
  cal = Calendar.getInstance();
  cal.setTime(  DateUtils.addHours( date, 5 ) );
  assertThat( cal.get( Calendar.HOUR_OF_DAY ), is( 10 ) );
  cal = DateUtils.toCalendar( DateUtils.addMilliseconds( date, 25 ) );
  assertThat( cal.get( Calendar.MILLISECOND ), is( 815 ) );
  // subtract
  cal = DateUtils.toCalendar( DateUtils.addYears( date, -10 ) );
  assertThat( cal.get( Calendar.YEAR ), is( 1970 ) );
  
  // truncate
  assertThat( DateUtils.truncate( date, Calendar.DAY_OF_MONTH ).toString(), is( "Wed Jan 02 00:00:00 EST 1980" ) ); 
 }
 
 @Test
 public void testIterator() {
  
  Iterator<Calendar> iter = DateUtils.iterator( date, DateUtils.RANGE_MONTH_SUNDAY );
  int i = 0;
  SimpleDateFormat sdf = new SimpleDateFormat( "yyyy/MM/dd" );
  while( iter.hasNext() ) {
   if( ++i == 10 ) break;
   System.out.print( sdf.format(iter.next().getTime()) + " ");
  }
 }

}




0 件のコメント: