GNU/Linux >> Linux の 問題 >  >> Ubuntu

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

これは、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のような地名を記憶しています。 タイムゾーンの説明だけでなく(時間の経過に伴うオフセット、表示名CETCEST およびCEDT )。これは、地理的なロケールがタイムゾーンルールを更新する場合に備えて、人間にとって使いやすく、堅牢です。 Sun(現在はOracle)Javaは/etc/timezoneを優先します (または/etc/sysconfig/clock Red Hatベースのディストリビューションの場合)/etc/localtimeのバグ#6456628を参照してください。 、OpenJDKとgcjがそれに続きます。

関連:DMPファイルのインポート中にOracleエラー12154?

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


Ubuntu
  1. Ubuntu16.04でHadoopMapReduceプログラムを実行する方法

  2. Ubuntu – Linux –ファイル変更時間と変更時間?

  3. Ubuntu用のPDFメタデータビューア/タグエディタ?

  1. Ubuntuのトップ10圧縮ユーティリティ

  2. Ubuntu 18.04でタイムゾーンを変更する-ステップバイステップのプロセス?

  3. Ubuntu14.04のGuiSsh?

  1. Ubuntu18.04でタイムゾーン/日付/時刻を設定または変更する方法

  2. Ubuntuサーバーに最適なログファイル監視ツール?

  3. ubuntu 12.04でファイルアクセス時間が更新されない