우분투에서 시간대 구성을 변경하기 위해 작성한 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 기반 배포판)를 선호합니다.CEST
CEDT
/etc/timezone
/etc/sysconfig/clock
버그 #6456628 참조, OpenJDK /etc/localtime
및GCJ따라하세요.
또한보십시오:현재 시스템 시간대를 찾는 방법은 무엇입니까?;자바 시간대 혼란.
해결책은 간단합니다. 항상 함께 /etc/timezone
업데이트하세요 /etc/localtime
. 데비안이나 우분투에서는시간대를 변경하는 공식적인 방법은 다음과 같습니다.dpkg-reconfigure tzdata
. 하나의 애플리케이션에 대한 시간대만 변경하려면 TZ
환경 변수를 설정하십시오(이는 모든 UNIX 시스템에서 이식 가능합니다).