Ubuntuでタイムゾーン設定を変更するために作成した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
環境変数が設定されていない場合、タイムゾーンがどのように決定されるかは指定されません。私はそこに何も見つかりませんLinux標準ライブラリこれに。これ基本システムライブラリ(GNU libc)/etc/localtime
タイムゾーンを決定するために使用されます。そのため、非埋め込みLinuxでは/etc/localtime
ここにタイムゾーン情報が保存され、理想的にはここで話が終わります。
(見てください:FreeBSD、NetBSD、OpenBSDは/etc/localtime
.Solarisを使用し、他のものは/etc/TIMEZONE
。Unix用ロゼッタストーン他の 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フォローしてください。
また見なさい:現在のシステムタイムゾーンを見つける方法は?;Javaタイムゾーンの混乱。
解決策は簡単です。常に一緒に/etc/timezone
更新してください/etc/localtime
。 DebianやUbuntuではタイムゾーンを変更する公式の方法は次のとおりです。dpkg-reconfigure tzdata
。 1つのアプリケーションのタイムゾーンのみを変更するには、TZ
環境変数を設定します(これはすべてのUNIXシステムで移植可能です)。