Joda-Time

소개

java.util.Calendar 와 java.util.DateTime 이 사용하기 불편하고 버그가 많고 확장도 어려움

Joda-Time 은 JDK 의 Calendar와 Date 를 대체하는 library.


Maven 연계

<dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>2.9.9</version>
</dependency>


java Calendar와 비교

좌측이 Joda, 우측이 java의 Calendar

Instance 생성

DateTime dateTime = new DateTime(2000, 1, 1, 0, 0, 0, 0);
Calendar calendar = Calendar.getInstance();
calendar.set(2000, Calendar.JANUARY, 1, 0, 0, 0);

Adding 90 days to an instant and printing the result, the JDK way

DateTime dateTime = new DateTime(2014, 1, 1, 0, 0, 0, 0);
System.out.println(dateTime.plusDays(90).toString("yyyy-MM-dd E HH:mm:ss.SSS"));
Calendar calendar = Calendar.getInstance();
calendar.set(2014, Calendar.JANUARY, 1, 0, 0, 0);
SimpleDateFormat sdf =
  new SimpleDateFormat("yyyy-MM-dd E HH:mm:ss.SSS");
calendar.add(Calendar.DAY_OF_MONTH, 90);
System.out.println(sdf.format(calendar.getTime()));

Joda result를 JDK Calendar object 에 전달

toDate() 메소드 활용
Calendar calendar = Calendar.getInstance();
DateTime dateTime = new DateTime(2014, 1, 1, 0, 0, 0, 0);
dateTime = dateTime.plusDays(45).plusMonths(1).dayOfWeek().withMaximumValue();
System.out.println(dateTime.toString("yyyy-MM-dd E HH:mm:ss.SSS");
calendar.setTime(dateTime.toDate());


사용

현재 시간 

DateTime dt = new DateTime();


String format 에서 DateTime 생성

DateTimeFormatter fmt = org.joda.time.format.DateTimeFormat.forPattern("yyyy-MM-dd hh:mm:ss");
		
DateTime dt = DateTime.parse("2014-02-03 11:22:33", fmt);

DateTimeFormatter 사용

String dateTime = "2013-11-15 08:12:34";
DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
// Parsing the date
DateTime jodatime = dtf.parseDateTime(dateTime);
// Format for output
DateTimeFormatter dtfOut = DateTimeFormat.forPattern("yyyy-MM-dd");
// Printing the date
System.out.println(dtfOut.print(jodatime));


java.util.Date 로 DateTime 생성

http://stackoverflow.com/questions/5042587/convert-from-java-util-date-to-jodatime

java.util.Date date = ...
DateTime dateTime = new DateTime(date);


java.sql.Timestamp type 으로 변환

DateTime dateTime = new DateTime();
Timestamp timeStamp = new Timestamp(dateTime.getMillis());


Spring 3.2.x 의 @DateTimeFormat 

Spring 3.2 부터는 Joda 가 없어도 annotation 으로 DateTimeFormat 사용가능. classpath에 joda 없으면 JDK 의 SimpleDateFormat 을 사용하고 있으면 joda 를 사용함. annotation 을 사용하려면 <mvc:annotation-driven /> 가 설정되어 있어야 함

http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-config-enable

@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
private Date date;
//iso=DateTimeFormat.ISO.DATE_TIME format yyyy-MM-dd'T'HH:mm:ss.SSSZ, e.g. 2000-10-31 01:30:00.000-05:00.
//@Ref http://docs.spring.io/spring/docs/3.2.6.RELEASE/javadoc-api/org/springframework/format/annotation/DateTimeFormat.ISO.html 
@DateTimeFormat(iso=DateTimeFormat.ISO.DATE_TIME)
private Date date;