2011년 6월 13일 월요일

Java's Date Classes Must Die.

date4j의 목표
"대부분의 나라에서 사용하는 GregorianCanlendar기준으로 조작이 쉽고 및 관계형 데이터베이스에서 저장 검색도 쉽게."

Date와 관련된 JDK 클래스들
Date and its subclasses :
- java.util.Date
- java.sql.Date
- java.sql.Timestamp
The calendar and time zone classes :
- java.util.Calendar
- java.util.GregorianCalendar
- java.util.TimeZone
- java.util.SimpleTimeZone (for use with the Gregorian calendar only)
The formatting and parsing classes :
- java.text.DateFormat
- java.text.SimpleDateFormat
- java.text.DateFormatSymbols

필자가 개발하고 있는 제품에서는 국제화를 지원한다. 국제화라는게 미국 사용자는 영어로, 한국 사용자는 한글로 내용을 보여주는 것보다. 세계에는 시차라는 게 존재하기에 더 복잡하고 머리아프고 신경을 써야 하는 부분이 날짜다.
한국에서 어떤 사용자가 오후 10시에 작성한 글이, 미국에서 워싱턴에서 보면 오후 10시가 아닌 오전 9시어야 하는 것이다.
방법은 아주 간단했다 . 날짜 저장은 그리니치표준시, 보여지는 날짜는 사용자의 위치에 따라 TimeZone 변경을 하였다.
JDK의 Date 관련 버그는 알려진 것보다 많았고, util.Date, sql.Date, Timestamp 변환도 많아 별것 아닌게 귀찮고, DataBase에 따라 버그도 있었다.(MS SQL Server 2005 버전에서 하루의 가장 마지막 시간을 가져오면 23:59:59.999가 아니고 마지막 3자리가 렌덤하게 나온다.)
고생한 경험이 있어 date4j소식이 있어 관심있게 보왔다. date4j javadoc을 보면 클래스는 딸랑 DateTime 하나있다.
이 하나로 다하는 것이다. 아래는 사용방법에 대한 예시이다.

DateTime dateAndTime = new DateTime("2010-01-19 23:59:59");
DateTime dateAndTime = new DateTime("2010-01-19 23:59:59.123456789");
DateTime dateOnly = new DateTime("2010-01-19");
DateTime timeOnly = new DateTime("23:59:59");
DateTime dateOnly = DateTime.forDateOnly(2010,01,19);
DateTime timeOnly = DateTime.forTimeOnly(23,59,59,0);
DateTime dt = new DateTime("2010-01-15 13:59:15");
boolean leap = dt.isLeapYear(); //false
dt.getNumDaysInMonth(); //31
dt.getStartOfMonth(); //2010-01-01, 00:00:00.000000000
dt.getEndOfDay(); //2010-01-15, 23:59:59.999999999
dt.format("YYYY-MM-DD"); //formats as '2010-01-15'
dt.plusDays(30); //30 days after Jan 15
dt.numDaysFrom(someDate); //returns an int
dueDate.lt(someDate); //less-than
dueDate.lteq(someDate); //less-than-or-equal-to

Although DateTime carries no TimeZone information internally, there are methods that take a TimeZone as a parameter :

DateTime now = DateTime.now(someTimeZone);
DateTime today = DateTime.today(someTimeZone);
DateTime fromMilliseconds = DateTime.forInstant(31313121L, someTimeZone);
birthday.isInFuture(someTimeZone);
dt.changeTimeZone(fromOneTimeZone, toAnotherTimeZone);
간단해서 좋다. Simple is best!
많은 기능만을 제공한다고 좋은 Open Source 라이브러리라고 생각하지 않는다. 간단한 하나의 기능만 가지고 있어도 유용하다면 그게
좋은 라이브러리 일 것이다.

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

ETL 솔루션 환경 하둡은 대용량 데이터를 값싸고 빠르게 분석할 수 있는 길을 만들어줬다. 통계분석 엔진인 “R”역시 하둡 못지 않게 관심을 받고 있다. 빅데이터 역시 데이터라는 점을 볼때 분산처리와 분석 그 이전에 데이터 품질 등 데이...