Ubuntu에서 시간대 프로필을 변경하기 위한 Java 프로그램 디버깅

Ubuntu에서 시간대 프로필을 변경하기 위한 Java 프로그램 디버깅

우분투에서 시간대 구성을 변경하기 위해 작성한 Ruby 스크립트입니다. 내가 운영해주비(JVM에서 실행되는 Ruby 인터프리터)

require 'java'

if ARGV.length == 0
  puts "Usage: jruby change_timezone.rb America/Toronto"
  exit
end

old_zone = File.read("../../../etc/timezone")
puts old_zone
time1 = Time.now
puts "Current Time:"+time1.localtime.to_s

new_zone = ARGV[0]
open('../../../etc/timezone','w') do |f|
  f.puts new_zone.to_s
  f.close
end

new_zone = File.read("../../../etc/timezone")
puts new_zone
time2 = Time.now
puts "Updated Time:"+time2.localtime.to_s

구성 파일이 올바르게 변경되었습니다. 그러나 스크립트의 출력은 예상과 다릅니다.

시간대의 기본값은 이라고 가정합니다 America/Toronto. 명령을 실행하면 jruby change_timezone.rb Asia/Chongqing출력은 다음과 같습니다.

America/Toronto
Current Time:Thu Jul 07 14:43:23 -0400 2011
Asia/Chongqing
Updated Time:Thu Jul 07 14:43:23 -0400 2011 (My Note: +0800 expected!!!)

계속해서 명령을 실행하면 jruby change_timezone.rb Europe/Amsterdam다음과 같이 끝납니다.

Asia/Chongqing
Current Time:Fri Jul 08 03:18:25 +0800 2011 (My Note: it actually got updated from last run!!!)
Europe/Amsterdam
Updated Time:Fri Jul 08 03:18:25 +0800 2011 (My Note: +0200 expected!!!)

다시 더 나아가서 jruby change_timezone.rb Europe/Amsterdam다음을 얻습니다.

Europe/Amsterdam
Current Time:Thu Jul 07 21:21:27 +0200 2011
Europe/Amsterdam
Updated Time:Thu Jul 07 21:21:27 +0200 2011

예상대로 작동하지 않는 이유를 누구나 알 수 있습니까?

답변1

이것은 Java가 Unix 시스템에서 시간대를 결정하는 방법에 대한 질문입니다.

이것POSIX 사양TZ환경 변수가 설정되지 않은 경우 시간대가 어떻게 결정되는지는 지정되지 않습니다 . 나는 거기에서 아무것도 찾을 수 없습니다리눅스 표준 라이브러리이에. 이것기본 시스템 라이브러리(GNU libc)/etc/localtime시간대를 결정하는 데 사용됩니다 . 따라서 비임베디드 Linux에서는 /etc/localtime여기에 시간대 정보가 저장되며 이상적으로는 여기서 이야기가 끝나게 됩니다.

(둘러보세요: FreeBSD, NetBSD 및 OpenBSD는 /etc/localtime.Solaris를 사용하고 다른 일부는 /etc/TIMEZONE.유닉스용 로제타스톤다른 unice에서 사용하는 콘텐츠를 표시합니다.푸드 라이브러리(일부 임베디드 Linux 시스템에서 사용됨) /etc/localtime, 반면유클리브사용 /etc/TZ(예외패치됨).)

불행하게도 Java는 일을 다르게 수행합니다. Debian과 Ubuntu /etc/timezone에는 시간대 이름이 포함된 이라는 파일이 있습니다 . 이 추가 파일은 패키징 시스템이 Europe/Amsterdam시간대에 대한 설명(시간에 따른 오프셋, 표시 이름 CET및 합계) 뿐만 아니라 지리적 이름을 기억하는 데 사용됩니다 . 이는 지리적 지역에서 시간대 규칙을 업데이트하는 경우 더 인간 친화적이고 더 강력합니다. Sun(현재 Oracle)은 Java(또는 Red Hat 기반 배포판)를 선호합니다.CESTCEDT/etc/timezone/etc/sysconfig/clock버그 #6456628 참조, OpenJDK /etc/localtimeGCJ따라하세요.

또한보십시오:현재 시스템 시간대를 찾는 방법은 무엇입니까?;자바 시간대 혼란.

해결책은 간단합니다. 항상 함께 /etc/timezone업데이트하세요 /etc/localtime. 데비안이나 우분투에서는시간대를 변경하는 공식적인 방법은 다음과 같습니다.dpkg-reconfigure tzdata. 하나의 애플리케이션에 대한 시간대만 변경하려면 TZ환경 변수를 설정하십시오(이는 모든 UNIX 시스템에서 이식 가능합니다).

관련 정보