これは、Ubuntuのタイムゾーン構成を変更するために作成したrubyスクリプトです。 jrubyで実行します (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
なぜそれが期待どおりに機能しなかったのか誰かが理解できますか?
承認された回答:
これは、JavaがUNIXシステムでのタイムゾーンを決定する方法の問題です。
POSIX仕様では、TZ
のタイムゾーンを決定する方法は指定されていません。 環境変数が設定されていません。 Linux Standard Baseにはこれについて何も見つかりません。
ベースシステムライブラリ(GNU libc)は/etc/localtime
を使用しています タイムゾーンを決定します。したがって、組み込みLinuxでは、/etc/localtime
タイムゾーン情報が保存される場所であり、理想的にはストーリーはここで終了します。
(見回す:FreeBSD、NetBSD、OpenBSDは/etc/localtime
を使用します 。 Solarisと他のいくつかは、/etc/TIMEZONE
を使用しています 。 Unix用のRosettaStoneは、他のUnixが使用するものを示しています。 Dietlibc(一部の組み込みLinuxシステムで使用)は/etc/localtime
を使用します 、uClibcは/etc/TZ
を使用します (パッチが適用されていない場合)。)
残念ながら、Javaの動作は異なります。 DebianとUbuntuには/etc/timezone
というファイルがあります タイムゾーンの名前が含まれています。この追加ファイルはパッケージングシステムを対象としているため、Europe/Amsterdam
のような地名を記憶しています。 タイムゾーンの説明だけでなく(時間の経過に伴うオフセット、表示名CET
、CEST
およびCEDT
)。これは、地理的なロケールがタイムゾーンルールを更新する場合に備えて、人間にとって使いやすく、堅牢です。 Sun(現在はOracle)Javaは/etc/timezone
を優先します (または/etc/sysconfig/clock
Red Hatベースのディストリビューションの場合)/etc/localtime
のバグ#6456628を参照してください。 、OpenJDKとgcjがそれに続きます。
解決策は簡単です。常に/etc/timezone
を更新してください。 および/etc/localtime
一緒。 DebianまたはUbuntuでは、タイムゾーンを変更する公式の方法はdpkg-reconfigure tzdata
です。 。 1つのアプリケーションのタイムゾーンのみを変更するには、TZ
を設定します 環境変数(これはすべてのUNIXシステム間で移植可能です)。