2008-08-08 6 views
26

Tomcat 응용 프로그램을 실행 중이며 시간 값을 표시해야합니다. 불행히도 시간이 한 시간 남았습니다. 내 기본 시간대가 다음과 같이 설정되어 있음을 확인하고 기본 시간대가 다음과 같이 설정되었음을 발견했습니다.Java 표준 시간대가 엉망입니다

sun.util.calendar.ZoneInfo[id="GMT-08:00", 
          offset=-28800000, 
          dstSavings=0, 
          useDaylight=false, 
          transitions=0, 
          lastRule=null] 

태평양 표준시 시간대가 아닌. 기본 시간대의 display name을 인쇄하려고하면 "GMT-08 : 00"으로 표시되며 이는 미국 태평양 표준 시간대로 올바르게 설정되지 않았 음을 나타냅니다. 나는 Gutsy Gibbon에서 업그레이드 된 Ubuntu Hardy Heron에서 실행 중입니다.

JRE가 모든 관련 일광 절약 시간 정보와 함께 Pacific을 사용하도록 알려주도록 업데이트 할 수있는 구성 파일이 있습니까? 내 컴퓨터의 시간이 올바르게 표시되므로 OS 전반의 잘못된 구성으로 보이지 않습니다.


좋습니다. 다음은 업데이트입니다. 동료는 "/Duser.timezone = US/Pacific"을 포함하도록/etc/profile 파일에서 JAVA_OPTS를 업데이트 할 것을 제안했습니다 (나는 또한 업데이트 된 CATALINA_OPTS도 보았습니다). 실제로, 나는 새로운/etc/profile을 사용하지 않고 변경 사항을 변수에 내 보냈다. (재부팅은 나중에 변경 사항을 고를 것이고 나는 황금색이 될 것이다).

그러나 여전히 더 나은 솔루션이 있다고 생각합니다. Java 용 구성이 있어야합니다. 즉, 사용하는 표준 시간대 또는 표준 시간대를 지정하는 방법을 지정해야합니다. 누군가가 그러한 설정을 알고 있다면 그것은 대단 할 것이지만 지금은 괜찮은 해결 방법입니다.


나는 1.5를 사용하고 있으며, 확실히 DST 문제입니다. 보시다시피, 표준 시간대는 일광 절약 시간제를 사용하지 않도록 설정됩니다. 내 생각에 일반적으로 특정 태평양 표준 시간대보다는 -8 오프셋으로 설정됩니다. 제네릭 -8 오프셋에는 일광 절약 시간 정보가 없으므로 물론 사용하지는 않지만 Java 시작시 태평양 표준 시간대를 사용하도록 Java에 지시해야합니까? 프로그래밍 방식의 솔루션을 찾고있는 것이 아니라 구성 솔루션이어야합니다.

답변

20

JVM이 zoneinfo 파일을 찾는 방식에서 "특이한 점"입니다. Bug ID 6456628을 참조하십시오.

가장 쉬운 해결 방법은/etc/localtime을 올바른 zoneinfo 파일에 대한 심볼릭 링크로 만드는 것입니다. 태평양 표준시에서는 다음 명령이 작동해야합니다.

# sudo cp /etc/localtime /etc/localtime.dist 
# sudo ln -fs /usr/share/zoneinfo/America/Los_Angeles /etc/localtime 

symlink 접근 방식에 아무런 문제가 없었습니다.

편집 : "sudo"명령이 추가되었습니다.

+0

+1 : 방금 업데이트 된 우분투 9.10 서버에서이 문제를 만났습니다. Sun JDK 1.6.0_15-b03, 시스템은 미국/동부 표준시의 설치 시간에 구성됩니다./etc/localtime은/usr/share/zoneinfo/US/Eastern과 동일한 내용을 포함합니다. Java는 2010 년 3 월 15 일에서 4 월 25 일 사이의 날짜에 대한 잘못된 결과를 생성합니다./usr/share/zoneinfo/US/Eastern에 대한 심볼릭 링크로 파일을 바꾼 후에 이제 올바른 결과를 얻습니다. 나는이 버그가 a) 여전히 열려있다. b) 완전히 업데이트 된 우분투 서버 (9.10 - Karmic)에 영향을 준다. –

+0

버그는 Java 버전 7 (b72)에서 닫힌 것으로 기록됩니다. – Raedwald

+0

/etc/localtime을 symlink로 변경합니다. 좀 더 현대적인 리눅스 시스템에서 (예를 들어, 패키지가 업그레이드 될 때 또는 시작시에 - 필자는 심볼릭 링크에서 파일 사본으로 변경하는 이유가 시동 시퀀싱 및 종속성과 관련이있을 것이라고 생각할 수있다. 특히/usr /이 다른 파일 시스템에있는 경우) TZ 환경 변수를 설정하는 것이 더 유용하다는 것을 알았습니다. –

0

OS가 사용하는 표준 시간대 규칙을 다시 확인하는 것이 도움이 될 수 있습니다.

/usr/bin/zdump -v /etc/localtime | less 

이 파일은 2080 년에이처럼 당신의 일광 절약 규칙을 포함해야한다 : 당신은 당신이 사용되어야한다고 생각 시간대 규칙이 비교할 수

/etc/localtime Sun Mar 31 01:00:00 2080 UTC = Sun Mar 31 02:00:00 2080 BST isdst=1 gmtoff=3600 

. 그들은 /usr/share/zoneinfo/에서 찾을 수 있습니다.

1

비슷한 문제가있을 수 있습니다. 동일한 문제 일 수 있습니다. 그러나 내 tomcat 서버는 Windows 상자에서 실행되므로 symlink 솔루션이 작동하지 않습니다.

JAVA_OPTS-Duser.timezone=Australia/Sydney을 설정했지만 Tomcat이 DST가 유효하다는 것을 인식하지 못합니다. 해결 방법으로 Australia/Sydney (GMT + 10 : 00)을 Pacific/Numea (GMT + 11 : 00)으로 변경 했으므로 시간이 올바르게 표시되지만 실제 솔루션이나 버그 (있는 경우)를 알고 싶습니다.

22

우분투에서는/etc/localtime 파일을 변경하는 것만으로는 충분하지 않습니다./etc/timezone 파일도 읽는 것 같습니다. 시간대를 올바르게 설정하려면 instruction을 따르는 것이 좋습니다. 특히, 다음을 수행하십시오

$ sudo cp /etc/timezone /etc/timezone.dist 
$ echo "Australia/Adelaide" | sudo tee /etc/timezone 
Australia/Adelaide 
$ sudo dpkg-reconfigure --frontend noninteractive tzdata 

Current default time zone: 'Australia/Adelaide' 
Local time is now:  Sat May 8 21:19:24 CST 2010. 
Universal Time is now: Sat May 8 11:49:24 UTC 2010. 

을 내 우분투, 경우의/etc /의 현지 및/etc/시간대에하는 일관성, 자바 등/시간대 /에서 기본 표준 시간대를 읽는 것 같다.

+0

우분투 10.0.4 LTS에서 매력처럼 작동합니다. 다소 좋았습니다. 단순히 sudo dpkg-reconfigure tzdata를 실행했습니다. – msung

+0

dpkg-reconfigure tzdata 정확히 내가 뭘 찾고 있었는지 고마워요! –

+0

이 문제는 lubuntu 16.04 (그놈)에서 만났습니다.이 솔루션은 매력처럼 작동했습니다. – 7yl4r

관련 문제