특정 국가, 환경에서 Java에서 가져온 시간과 윈도우에 적용된 시간 값이 다른 경우가 발생할 수 있다.
이는 대부분 오래된 JDK나 JRE를 사용해서 생긴 문제라고 보면 된다.
우리에겐 낯설은 써머타임(Daylight saving time, DST)에 대한 것인데,
써머타임 적용, 폐지에 대한 신규 정보가 JVM 시스템에 반영되어있지 않아서 발생하는 문제라고 한다.
해결은 JDK나 JRE를 최신 버전으로 올려주면 되는데 문제는 쉽게 업데이트를 결정할 수 없는 경우다. (안정성 또는 호환성 고려, 폐쇄망 환경 등으로 인한 업데이트의 어려움)
이 경우엔 아래의 두가지 대안이 있다.
1. 실행 옵션에 -XX:+UseGetTimeOfDay를 적용.
시간 관련 동작 수행 시 매번 gettimeofday() 시스템 콜을 이용해 시스템 시간을 가져온다. 성능 저하가 있다.
2. 타임존 정보를 갱신해주는 프로그램을 이용해 패치 (Time Zone Updater)
오라클에서 제공하고 있다.
tzupdater.jar를 내려받은 후 아래 명령어를 실행해주면 시간이 정상적으로 보정된다.
java -jar tzupdater.jar -v -f -l http://data.iana.org/time-zones/releases/tzdata2017c.tar.gz