Ubuntuでタイムゾーンプロファイルを変更するためのJavaプログラムのデバッグ

Ubuntuでタイムゾーンプロファイルを変更するためのJavaプログラムのデバッグ

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/TIMEZONEUnix用ロゼッタストーン他の 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フォローしてください。

また見なさい:現在のシステムタイムゾーンを見つける方法は?;Javaタイムゾーンの混乱

解決策は簡単です。常に一緒に/etc/timezone更新してください/etc/localtime。 DebianやUbuntuではタイムゾーンを変更する公式の方法は次のとおりです。dpkg-reconfigure tzdata。 1つのアプリケーションのタイムゾーンのみを変更するには、TZ環境変数を設定します(これはすべてのUNIXシステムで移植可能です)。

おすすめ記事