[Java/Android] 안드로이드 특정기기에서 발생하는 SimpleDateFormat 버그

안드로이드에서 시간을 표기해 줄때 다양한 포맷으로 변경을 하기 위해 SimpleDateFormat을 활용하였습니다. 하지만 여기서 생각치도 못한 버그가 있었습니다. 회사에서 가지고 있는 몇몇 디바이스들로 테스트 해본 결과 특정 기기에서만 발생하는 것을 확인하였습니다. (예: LG 거의 모든 제품)

아이폰 개발을 처음할 당시에 아이폰이 없어서 아이팟 터치만으로 개발하고 전세계 앱스토어에 런칭을 했을때 모두들 잘된다는 피드백이 오던 시절과는 너무도 다른 안드로이드의 현실에 조금은 답답해지는 순간입니다. 왜 안드로이드는 기기마다 다를까요.

위와 같은 소스를 실행해 보았습니다. 위의 소스는 1900년도부터 2001년까지의 1월1일 0시를 출력하는 몇가지 예제 소스입니다. 주석으로 붙여둔 부분의 값이 그대로 나와야 정상입니다. 우선 제가 가지고 있는 모토글램으로 테스트를 해보겠습니다.

사용자 삽입 이미지

왼쪽과 오른쪽이 동일하면 정상입니다. 모토글램의 경우 매우 정상이네요. 다음은 LG의 견인차 역할을 한 옵티머스원입니다.

사용자 삽입 이미지

한번 천천히 살펴보겠습니다. 1900년도의 날짜와 시간표기에는 아무런 문제가 없습니다. 하지만 1902년부터 시간이 -47분40초가 됩니다. 그러더니 1913년부터는 아예 -1시간이 되는군요. 정말 신기한 현상입니다. 더신기한건 2001년부터 날짜표기 오류가 정상으로 돌아옵니다.

우선 대부분의 안드로이드폰에서는 이런 문제가 발생하지 않습니다. 날짜와 시간을 중요하는 어플리케이션을 개발중이시라면 SimpleDateFormat의 사용을 자제하시기 바랍니다. 기기특성을 타는 문제가 있습니다.

  • ㅁㅁ

    안녕하세요
    저는 마켓에서 달력/일정관리 어플 배포하고있는데요,
    특정 스마트폰 사용자들이 1900년도에 기념일을 등록하면 하루전으로 저장된다고 불만을 호소하더군요.. 마침 저도 가지고 있는폰이 모토글램뿐인지라 어떻게 해결방법을 찾지못하고 있었는데.. 블로그보고 많은 도움이 되었습니다.

    그런데.. 모토글램도 프로요 이후로 동일한 문제가 발생하더군요. SimpleDateFormat만의 문제가 아닌것같습니다.

    for(int i = 1900; i < = 2000; i++){ Date date = new Date(i-1900, 0, 1); Log.d("TEST", i + " > ” + date.toLocaleString());
    }

    이렇게 돌려보면 특정연도에서 30분 혹은 1시간이 줄어듭니다..

    기본적으로 폰에 탑재되어있는 “캘린더”어플에서도 문제가 있는 연도에 일정을 등록해보면 제대로 등록되지 않는것을 확인할수있구요..

    이클립스 에뮬레이터조차도 1932년에서 동일한 오류를 뿜어내니…
    정말 기가막히고.. 코가막힐노릇입니다..

    제조사에 버그수정 요청하는것밖에는 방법이 없는것일까요..정말 답답하네요..

    • 저는 그냥 다른 날짜관련 라이브러리를 사용하는것으로 해결을 봤습니다.

      http://joda-time.sourceforge.net/

      모든 안드로이드폰에서(현재까지 테스트해본것중에서만이지만요) 테스트 해보았습니다. 소스도 다운받을수 있으니 정적으로 포함시킬수 있습니다.

    • 참고로 LG측에 메일도 보내보았지만 팀장급의 사람에게 알아보고 연락주겠다고 연락온 이후로 아무말이 없더군요. 그래도 답장을 한번 줬다는것을 높게 평가하고 있습니다.