[JAVA] SimpleDateFormat 클래스와 위험성
SimpleDateFormat 클래스와 위험성
JAVA 1.5에서는 Formatter 클래스를 지원하면서, 다양한 확장된 Format 클래스들이 나왔다.
이중에서 가장 많이 Formatting이 필요한게 날짜 관련인데, 이는 앞에 Formatter 클래스에서 설명을 했다.
[JAVA/Java] - [JAVA] Formatter 클래스 format(), 날짜 format()
하지만 SimpleDateFormat 클래스라는 좀 더 쉽게 날짜 Formatting이 가능한 클래스가 있다.
또한 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 과 비교하여 추후에 테스트 해봐야 겠다.
출처: https://hyeonstorage.tistory.com/232?category=557602 [개발이 하고 싶어요]
'JAVA > Java' 카테고리의 다른 글
StringUtils(Trim, Truncate) -문자열 처리 클래스 (0) | 2020.01.27 |
---|---|
StringUtils(Empty, Blank) -문자열 처리 클래스 (0) | 2020.01.27 |
RandomStringUtils - 랜덤 문자열 생성 (0) | 2020.01.23 |
[JAVA] 상속, 인터페이스에 의한 다형성(polymorphism) (0) | 2019.10.07 |
[JAVA] Formatter 클래스 format(), 날짜 format() (0) | 2019.10.07 |
[JAVA] HashMap 클래스 (0) | 2019.10.07 |
[JAVA] Enumeration 인터페이스 정리 (0) | 2019.10.07 |
[JAVA] Vector 클래스 정리 (0) | 2019.10.01 |