[JAVA] SimpleDateFormat 클래스와 위험성

2019. 10. 7. 11:52 JAVA/Java

SimpleDateFormat 클래스와 위험성



JAVA 1.5에서는 Formatter 클래스를 지원하면서, 다양한 확장된 Format 클래스들이 나왔다.

이중에서 가장 많이 Formatting이 필요한게 날짜 관련인데, 이는 앞에 Formatter 클래스에서 설명을 했다.


[JAVA/Java] - [JAVA] Formatter 클래스 format(), 날짜 format()


하지만 SimpleDateFormat 클래스라는 좀 더 쉽게 날짜 Formatting이 가능한 클래스가 있다.


SimpleDateFormat format = new SimpleDateFormat("yyyy년 MM월 dd일 hh시 mm분 ss초");


또한 format의 대상으로 Date() 클래스와 Calendar 클래스를 모두 사용할 수 있다.


 

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);

    }

}



- 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 API DOC



출처: https://hyeonstorage.tistory.com/232?category=557602 [개발이 하고 싶어요]