땀이 삐질삐질 나는 개발 일기

SimpleDateFormat 과 Calendar대신 Joda Time 본문

개발 Tip

SimpleDateFormat 과 Calendar대신 Joda Time

삐질 2019. 6. 5. 22:47

안녕하세요. 삐질삐질 개발하는 개발자 삐질입니다.

오늘은 날짜로직을 다루다 보면, 심심치 않게 SimpleDateFormat 과 Calendar를 많이 쓰게되는데

이때 SimpleDateFormat의 위험성 및 단점을 알려드리고 또 대체제를 알려드리고자 합니다.

SimpleDateFormat api의 위험성이란?

  1. 쓰기 어렵다.
  2. Thread - non Safe하다.

자 여기서 1. 쓰기 어렵다.(?)는 다들 아실거라 생각해서 넘어가도록 하겠습니다.

2.Thread - non Safe하다. 는 무슨말일까요??

사실 SingleThread 작업을 하시는 분들께는 큰 의미가 없는 이야기입니다.

다만, MultiThread작업을 하시는 분들은 SimpleDateFormat를 쓰다보면 종종 ArrayIndexOutOfBoundsException Exception을 만나게됩니다.

ThreadSafe하지 않은 요인(타이밍 이슈라던지, 락킹등)  + 기타 요인들로 인해 

뭐 정말정말 간략히 설명하자면, 내가 일 하고있는데 옆 사람이 끼어들어서 제 일을 방해함으로, 제가 전혀 예상치 못한 결과가 나오게 되는!?

( 뮤텍스, 세마포어, 크리티컬 섹션, 모니터, 쓰레드 공유메모리 등) 운영체제 쪽의 지식입니다만 이쪽의 내용을 공부하시면 자세히 알수 있습니다.



따라서 이 SimpleDateFormat  대신, 저는 JodaTime을 추천하고자 합니다.

  • Dependency
implementation 'joda-time:joda-time:2.10.2'

위와 같이 추가해준 뒤, 아래와 같이 사용할 수 있습니다. 
사용법이 매우 직관적이므로 간편하게  사용할 수 있고, 무엇보다 MultiThread 작업 시, Thread Safe합니다.

DateTime dateTime = DateTime.now();
System.out.println(dateTime.toString("yyyy-MM-dd")); //패턴을 지정할 수 있음.
System.out.println(dateTime.toString());


dateTime= dateTime.plusDays(1);
dateTime = dateTime.plusYears(1);

dateTime = dateTime.minusDays(1);
dateTime = dateTime.minusYears(1);

dateTime = dateTime.withTime(15,0,0,0); // 시간 3 0 0 (0)


  • 번외로 Apache의 FastDateFormat도 있으니 참고하시면 좋을 것 같습니다.




안드로이드 초보 개발자를 위해 아래와 같은 카카오 오픈톡을 운영 중입니다


Comments