Java

JDK and TimeZone

_침묵_ 2006. 12. 7. 20:20

출처 :http://www.javaservice.net/~java/bbs/read.cgi?m=etc&b=jdk&c=r_p&n=958034909&p=10&s=t

 

 

제목 : JDK and TimeZone
글쓴이:
이원영(javaservice) 2000/05/11 17:48:29 조회수:5089 줄수:323
먼저 Unix 시스템의 TZ 환경변수에 대해 알아 보겠습니다.현재 실 한국시간 : Thu May 11 16:53:50 KST 2000 javaservice:/tmp$ env|grep LANGLANG=kojavaservice:/tmp$ env|grep TZjavaservice:/tmp$ dateThu May 11 16:53:25 KST 2000javaservice:/tmp$ export TZ=KSTjavaservice:/tmp$ dateThu May 11 07:53:40 KST 2000    <--- 잘못된 시각javaservice:/tmp$ export TZ=KST-9javaservice:/tmp$ dateThu May 11 16:53:50 KST 2000   <-- 정상적인 시간 표시javaservice:/tmp$ export TZ=GMTjavaservice:/tmp$ dateThu May 11 07:56:49 GMT 2000javaservice:/tmp$ export TZ=JSTjavaservice:/tmp$ dateThu May 11 07:56:59 JST 2000javaservice:/tmp$ export TZ=JST-9javaservice:/tmp$ dateThu May 11 16:57:09 JST 2000javaservice:/tmp$ unset TZjavaservice:/tmp$ dateThu May 11 16:58:06 KST 2000javaservice:/tmp$따라서 TZ 변수를 셋팅하지 않은 Default 상태이거나, 명시적으로 export TZ=KST-9와 같이 "TIMEZONE은 KST 이며, GMT 즉, 표준시각보다 9시간이 빠른 시간대"를 사용할수 있습니다.그렇다면, JDK에서는 이러한 각 나라별 시간대를 제대로 인식하고 있을까요?가장 참한(?) 모습은 위와 같이 Default 상태에서 해당 나라의 표준 시간대를자동으로 표시해 주는 것일 겁니다.그러나 아쉽게도 한국시간대 KST는 JDK 버전마다 조금씩 다른 양상을 보이고 있습니다.JVM의 System Properties 에 user.timezone 이란 것이 있습니다.   user.timezone=GMT   user.timezone=KST   user.timezone=JST이 값은 java.util.Date 클래스를 사용할 때 결정적인 영향을 미칩니다.만약 user.timezone  제대로 설정 하지 않으면, JDK의 버전에 따라사 약간씩 다릅니다만,원하는 시각이 제대로 나오지 않을 겁니다.public class TimeTest {  public static void main(String[] args) {     System.out.println("user.timezone=" + System.getProperty("user.timezone"));     System.out.println(new java.util.Date());  }}아래는 Linux 환경에서 테스트 한 것입니다. 어떤 OS에서 어떤 버전의 JDK를 사용하느냐에따라 매우 많이 다르므로 각자 자신의 OS 환경에 맞게 테스트 해보세요.아래와 같은 일련을 명령어를 이용하여 테스트 해 보시고, 혹시 추가로 언급되어야 할사항이 있으면 메일 주세요.Linuxjavaservice:/tmp# uname -aLinux javaservice.net 2.2.12-20kr #1 Tue Oct 12 16:46:36 KST 1999 i686 unknownJDK 1.1.7B for Linux, blackdown.orgjavaservice:/tmp# java -fullversionjava_ns full version "Linux_JDK_1.1.7B_v3_native_threads"javaservice:/tmp$ env|grep LANGLANG=kojavaservice:/tmp$ env|grep TZjavaservice:/tmp$ dateThu May 11 17:03:43 KST 2000javaservice:/tmp$ java TimeTestuser.timezone=KSTThu May 11 08:03:48 GMT 2000javaservice:/tmp$ export TZ=KST-9javaservice:/tmp$ dateThu May 11 17:04:34 KST 2000javaservice:/tmp$ java TimeTestuser.timezone=KSTThu May 11 08:04:39 GMT 2000javaservice:/tmp# export TZ=KSTjavaservice:/tmp# java TimeTestuser.timezone=KSTThu May 11 07:25:17 GMT 2000javaservice:/tmp$ export TZ=JST-9javaservice:/tmp$ java TimeTestuser.timezone=JSTThu May 11 17:05:03 JST 2000javaservice:/tmp# export TZ=javaservice:/tmp# java TimeTestuser.timezone=UTCThu May 11 07:26:04 GMT+00:00 2000javaservice:/tmp# java -Duser.timezone=KST TimeTestuser.timezone=KSTThu May 11 07:26:24 GMT 2000javaservice:/tmp# java -Duser.timezone=JST TimeTestuser.timezone=JSTThu May 11 16:26:28 JST 2000javaservice:/tmp#분석: Linux JDK 1.1.7B 에서 TimeZone은 KST 로 자동 인식은 하지만,       java.util.Date에서는  GMT 로 자료를 처리합니다.      따라서 TimeZone 을 "JST"로 해야만 한국현재시각을 표시할 수 있습니다.      이 값은 환경변수 TZ 값으로 설정할 수 있으면, 또한 위처럼       -Duser.timezone=JST 와 같은 방법으로도 설정할 수 있습니다.결론: 다음과 같이 두가지 방법을 사용할 수 있습니다.      (1) export TZ=JST-9 으로 환경변수를 마추어 사용한다.      (2) -Duser.timezone=JST 로 명식적으로 사용한다.     NOTE : export TZ=KST-9, export TZ=JST-9 등과 같이 명식적으로 시간대를            설정해 줄 수 있지만, java -Duser.timezone=JST-9 TimeTest 와 같이            사용할 수는 없습니다. GMT 시간으로 표시됩니다.     첨언: JST(일본표준시간) 과 KST(한국표준시간)은 GMT 시간보다 9 시간이           빠른 시간대입니다. 일본시간과 한국시간은 동일합니다.JDK 1.1.8 for Linux, blackdown.orgjavaservice:/tmp# java -fullversionjava full version "Linux_JDK_1.1.8_v1_native_threads"javaservice:/tmp$ java -fullversionjava full version "Linux_JDK_1.1.8_v1_green_threads"javaservice:/tmp$ env|grep LANGLANG=kojavaservice:/tmp$ env|grep TZjavaservice:/tmp$ java TimeTestuser.timezone=JSTThu May 11 17:15:46 JST 2000javaservice:/tmp$ export TZ=KST-9javaservice:/tmp$ dateThu May 11 17:16:04 KST 2000javaservice:/tmp$ java TimeTestuser.timezone=JSTThu May 11 17:16:11 JST 2000javaservice:/tmp$ export TZ=KSTjavaservice:/tmp$ dateThu May 11 08:16:28 KST 2000javaservice:/tmp$ java TimeTestuser.timezone=GMTThu May 11 08:16:40 GMT 2000javaservice:/tmp$ export TZ=JSTjavaservice:/tmp$ dateThu May 11 08:18:19 JST 2000javaservice:/tmp$ java TimeTestuser.timezone=GMTThu May 11 08:19:27 GMT 2000javaservice:/tmp$ export TZ=JST-9javaservice:/tmp$ dateThu May 11 17:18:29 JST 2000javaservice:/tmp$ java TimeTestuser.timezone=JSTThu May 11 17:18:33 JST 2000javaservice:/tmp$javaservice:/tmp$ unset TZjavaservice:/tmp$ dateThu May 11 17:23:12 KST 2000javaservice:/tmp$ java -Duser.timezone=KST TimeTestuser.timezone=KSTThu May 11 08:23:28 GMT 2000javaservice:/tmp$ java -Duser.timezone=JST TimeTestuser.timezone=JSTThu May 11 17:23:34 JST 2000javaservice:/tmp$분석: Linux JDK 1.1.8 에서는 TimeZone은 Default로  JST로 인식합니다.      내부적인 처리도 JST로 합니다.       export TZ=JST-9 등과 같이 TZ 환경변수를 명시적으로 셋팅할 수 있습니다.      그러나 export TZ=KST-9 로 셋팅하면, 자동으로 JVM은 "JST" 변경하여      일본표준시간으로 인식하게 됩니다.      unset TZ 로 환경변수를 초기화 하면 자동으로 다시 JST로 인식합니다.       따라서, JVM 내부적으로는 아직 KST를 처리하지 못하지만, 자동으로 JST로      변경하여 사용하게 됩니다.결론: (1) Default 상태에서 그대로 사용한다.      (2) export TZ=KST-9  혹은 export TZ=JST-9 를 한 후 사용한다.      (3) -Duser.timezone=JST 로 명식적으로 사용한다.IBM JDK 1.1.8 for Linuxjavaservice:/tmp$ java -fullversionjava full version "JDK 1.1.8 IBM build l118-20000325 (JIT enabled: jitc)"javaservice:/tmp$ env|grep LANGLANG=kojavaservice:/tmp$ env|grep TZjavaservice:/tmp$ dateThu May 11 17:36:17 KST 2000javaservice:/tmp$ java TimeTestuser.timezone=JSTThu May 11 17:36:21 JST 2000javaservice:/tmp$ export TZ=JSTjavaservice:/tmp$ dateThu May 11 08:36:44 JST 2000javaservice:/tmp$ java TimeTestuser.timezone=GMTThu May 11 08:36:52 GMT 2000javaservice:/tmp$ export JST-9export: JST-9: not a legal variable namejavaservice:/tmp$ export TZ=JST-9javaservice:/tmp$ dateThu May 11 17:37:12 JST 2000javaservice:/tmp$ java TimeTestuser.timezone=JSTThu May 11 17:37:16 JST 2000javaservice:/tmp$ export TZ=KST-9javaservice:/tmp$ dateThu May 11 17:37:24 KST 2000javaservice:/tmp$ java TimeTestuser.timezone=JSTThu May 11 17:37:30 JST 2000javaservice:/tmp$ java -Duser.timezone=KST TimeTestuser.timezone=KSTThu May 11 08:38:13 GMT 2000javaservice:/tmp$ java -Duser.timezone=JST TimeTestuser.timezone=JSTThu May 11 17:38:30 JST 2000javaservice:/tmp$분석: blackdown Linux JDK 1.1.8 과 동일합니다.결론: (1) Default 상태에서 그대로 사용한다.      (2) export TZ=KST-9  혹은 export TZ=JST-9 를 한 후 사용한다.      (3) -Duser.timezone=JST 로 명식적으로 사용한다.Windows 95Sun JDK 1.1.8ME:\>java -fullversionjava full version "JDK1.1.8M"E:\>javac TimeTest.javaE:\>date현재 날짜는 2000-05-12 금요일 입니다E:\>time현재 시간은  18:52:33.82 입니다.E:\>java TimeTestuser.timezone=JSTFri May 12 18:52:42 JST 2000E:\>java -Duser.timezone=GMT TimeTestuser.timezone=GMTFri May 12 09:55:31 GMT 2000E:\>java -Duser.timezone=KST TimeTestuser.timezone=KSTFri May 12 09:55:49 GMT 2000E:\>java -Duser.timezone=JST TimeTestuser.timezone=JSTFri May 12 18:56:43 JST 2000결론: (1) Default 상태에서 그대로 사용한다.주의: Windows 나, HP-UX, 그리고, AIX 등 OS환경과 JDK 버전이 무엇이냐에 따라       미묘하게 달라집니다.      만약 Java 를 사용하시다가 시간대가 GMT 시간으로 나온다면, 이 문서를      참조하시기 바랍니다.      아직 테스트하지 OS와 JDK 버전은 직접 해 보세요.PS: 보다 많은 내용이 필요하시면 김덕태님의 아래 자료를 참고하세요.http://camars.kaist.ac.kr/~dtkim/java/format.htmlPS: 근데 Default TimeZone 이 JST 라니 좀 분하지 않습니까?    Solaris 에선 제대로 KST 를 인식한 것으로 기억합니다.PS: RS/6000 AIX 에서는 "export TZ=KORST-9" 가 Default 상태이며, 이것으로 Java에선    충분합니다. 간혹, TZ값에 다른 값이 들어 있을 수 있는데, Java 에서 시간이    엉뚱하게 나타날 것입니다. 시스템 관리자와 상의해 보세요.NOTE: 머신의 시각을 맞출 때 가이드 라인은 GMT시각으로 항상 전세계의 모든 머신이    동일한 시각을 나타내도록 맞춥니다. 그 다음 환경변수로 설정가능한 TIMEZONE을     한국의 경우 -9로만 설정하면 각종 로그에 시각이 한국표준시에 맞게 표현됩니다.    간혹 사이트에 가 보면, TIMEZONE을 GMT(0)로 설정한 채, 한국시각으로 맞추는 경우가    종종있는데, 이건 좀 개념이 없는 결과라 할 수 있습니다.-------------------------------------------------------    본 문서는 자유롭게 배포/복사 할 수 있으나 반드시  이 문서의 저자에 대한 언급을 삭제하시면 안됩니다================================================  자바서비스넷 이원영  E-mail: javaservice@hanmail.net  PCS:019-310-7324================================================
제목 : Re: JST 대신에 Asia/Seoul 로
글쓴이: 해바다(guest) 2004/07/23 10:37:01 조회수:243 줄수:3
-Duser.timezone=JST 라고 명시하면 "일본표준시"라고 표시됩니다그래서-Duser.timezone=Asia/Seoul 로 명시하면 "한국표준시"라고 나옵니다..

'Java' 카테고리의 다른 글

I18N Messages and Logging  (0) 2006.12.07
Using Java 2 JNI on HP-UX  (0) 2006.12.06
여러종류의 데이타베이스 테스트 소스  (0) 2006.11.07