SimpleDateFormat 클래스와 위험성
JAVA 1.5에서는 Formatter 클래스를 지원하면서, 다양한 확장된 Format 클래스들이 나왔다.
이중에서 가장 많이 Formatting이 필요한게 날짜 관련인데, 이는 앞에 Formatter 클래스에서 설명을 했다.
[JAVA] Formatter 클래스 format(), 날짜 format()
하지만 SimpleDateFormat 클래스라는 좀 더 쉽게 날짜 Formatting이 가능한 클래스가 있다.
또한 format의 대상으로 Date() 클래스와 Calendar 클래스를 모두 사용할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class FormatterTest { public static void main(String[] args) { SimpleDateFormat df = new SimpleDateFormat("yyyy년 MM월 dd일 hh시 mm분 ss초"); Date date = new Date(); String today = df.format(date); System.out.println(today); Calendar c = Calendar.getInstance(); String today2 = df.format(c.getTime()); System.out.println(today2); } } | cs |
- SimpleDateFormat 으로 날짜 데이터 포맷 형식을 "yyyy년 MM월 dd일 hh시 mm분 ss초" 로 지정하였다.
- Date() 클래스와 Calendar 클래스를 SimpleDateFormat 에 format()으로 포매팅 하면 현재 날짜 시간으로 지정한 포맷으로 데이터를 변환한다.
* 날짜 symbol
ex> 현재 일자 : 2014년 01월 01일 13시 20분 10초
Symbol | 설명 | 사용 예 |
y | year : 년도 | yy : 14 , yyyy : 2014 |
M | month in year : 월 | M : 1, MM : 01, MMM : 1월 |
d | day in month : 일 | d : 1, dd : 01, ddd : 001, dddd : 0001 |
h | hour in am/pm(1-12) : 시 | h : 1 , hh : 01, hhh : 001, hhhh : 0001 |
a | am/pm marker | a : 오후 (AM/PM 으로 표시하려면 format에서 Locale.US를 지정) |
k | hour in day (1-24) : 시 | k : 13, kk : 13, kkk : 013, kkkk : 0013 |
m | minute in hour : 분 | m : 20, mm: 20, mmm : 020, mmmm : 0020 |
s | second in minute : 초 | s : 10, ss : 10, sss : 010. ssss: 0010 |
w | week in year : 주(년기준) | w : 1, ww : 01, www :001, wwww : 0001 |
D | day in year : 일(년기준) | D : 1, DD : 01, DDD: 001, DDDD : 0001 |
E | day of week : 요일 | E : 수 |
F | day of week in month : 월 기준 주간 요일 순번 | F : 1, FF : 01, FFF:001, FFFF:0001 |
G | era designator : 시대 | AD |
H | hour in day (0-23) : 시 | H: 13, HH : 13, HHH : 013 , HHHH:0013 |
K | hour in am/pm(0-11) : 시 | K: 1 , KK : 01, KKK :001, KKKK: 0001 |
S | fractional seconds : 초 | S : 402 |
W | week in month : 주 (월기준) | W : 1, WW : 01, WWW : 001, WWWW : 0001 |
z | time zone | z : KST, zzzz: 한국표준시 |
Z | time zone (RFC 822) | Z : +0900 |
위의 날짜 Symbol을 사용하여 원하는 날짜 형식으로 출력할 수 있다.
* SimpleDateFormat 클래스의 위험성
멀티 쓰레드의 부하가 많이 걸리는 부분에서 SimpleDateFormat을 사용하면java.lang.ArrayIndexOutOfBoundsException 에러가 종종 발생한다.
SimpleDateFormat은 Thread-safe 하지 못하기 때문에 발생하는 문제이다.
따라서 멀티 쓰레드를 사용하는 부하가 많은 시스템에서는 SimpleDateFormat을 사용할 때 주의해야 한다.
이를 보완해서 Joda-Time 이라는 라이브러리 또는 apache의 common에 FastDateTime 이라는 라이브러리가 있다고 한다.
이 라이브러리들은 Thread-Safe 하며 속도도 빠르다고 하니, SimpleDateTime 보다는 이것들을 사용하는 것이 좋다.
이 대체 라이브러리들에 대해서는 SimpleDateTime 과 비교하여 추후에 테스트 해봐야 겠다.
'개발' 카테고리의 다른 글
[java] DB의 내용을 json으로 리턴 @ResponseBody (0) | 2014.08.10 |
---|---|
[javascript] 페이지 로딩시 시작 제이쿼리 (0) | 2014.08.09 |
[java] post로 값 넘기기 (0) | 2014.08.05 |
[java] Spring Beans Problem 오류 (0) | 2014.07.31 |
[javascript] 페이스북 api 연동 (0) | 2014.07.23 |