質問
Tomcat アプリケーションを実行しているので、いくつかの時間値を表示する必要があります。残念ながら、時間があと1時間迫ってきました。調べてみたところ、デフォルトのタイムゾーンが次のように設定されていることがわかりました。
sun.util.calendar.ZoneInfo[id="GMT-08:00",
offset=-28800000,
dstSavings=0,
useDaylight=false,
transitions=0,
lastRule=null]
太平洋時間帯ではなく。これは、デフォルトのタイムゾーンを印刷しようとするとさらに表示されます。 表示名, 、すると「GMT-08:00」と表示されますが、これは米国太平洋タイムゾーンに正しく設定されていないことを示しているようです。Gutsy Gibbon からアップグレードした Ubuntu Hardy Heron で実行しています。
関連するすべての夏時間情報とともに Pacific を使用するように JRE に指示するために更新できる構成ファイルはありますか?私のマシンの時刻は正しく表示されているため、OS 全体の構成ミスではないようです。
さて、更新情報です。同僚が、/etc/profile の JAVA_OPTS を更新して「-Duser.timezone=US/Pacific」を含めるように提案しました。これでうまくいきました (CATALINA_OPTS も表示され、これも更新しました)。実際には、新しい /etc/profile を使用するのではなく、変更を変数にエクスポートしただけです (後で再起動すると変更が反映され、ゴールデンになります)。
ただし、もっと良い解決策があると思います...Java がどのタイムゾーンを使用しているか、またはどのようにタイムゾーンを取得しているかを示す Java の設定がどこかにあるはずです。誰かがそのような設定を知っていれば素晴らしいことですが、今のところ、これは適切な回避策です。
私は 1.5 を使用していますが、これは間違いなく DST の問題です。ご覧のとおり、タイムゾーンは夏時間を使用しないように設定されています。私の考えでは、特定の太平洋タイムゾーンではなく、一般的に -8 オフセットに設定されています。一般的な -8 オフセットには夏時間情報がないため、もちろん使用しませんが、問題は、起動時に太平洋タイム ゾーンを使用するように Java にどこで指示するかということです。私はプログラムによる解決策を探しているのではなく、構成による解決策であるべきです。
解決
これは、JVM がzoneinfo ファイルを検索する方法における「癖」です。見る バグID 6456628.
最も簡単な回避策は、/etc/localtime を正しいzoneinfo ファイルへのシンボリックリンクにすることです。太平洋時間の場合、次のコマンドが機能するはずです。
# sudo cp /etc/localtime /etc/localtime.dist
# sudo ln -fs /usr/share/zoneinfo/America/Los_Angeles /etc/localtime
シンボリックリンクのアプローチでは問題はありませんでした。
編集:コマンドに「sudo」を追加しました。
他のヒント
Ubuntu では、/etc/localtime ファイルを変更するだけでは十分ではありません。/etc/timezone ファイルも読み込むようです。従ったほうがいいですよ 命令 タイムゾーンを正しく設定します。特に、次のことを実行します。
$ sudo cp /etc/timezone /etc/timezone.dist
$ echo "Australia/Adelaide" | sudo tee /etc/timezone
Australia/Adelaide
$ sudo dpkg-reconfigure --frontend noninteractive tzdata
Current default time zone: 'Australia/Adelaide'
Local time is now: Sat May 8 21:19:24 CST 2010.
Universal Time is now: Sat May 8 11:49:24 UTC 2010.
私の Ubuntu では、 /etc/localtime と /etc/timezone が矛盾している場合、Java は /etc/timezone からデフォルトのタイムゾーンを読み取るようです。
同様の問題、おそらく同じ問題がありました。ただし、私の Tomcat サーバーは Windows ボックス上で実行されているため、シンボリックリンク ソリューションは機能しません。
設定しました -Duser.timezone=Australia/Sydney
の中に JAVA_OPTS
ただし、tomcat は DST が有効であることを認識しません。回避策として私は変更しました Australia/Sydney
(GMT+10:00) ~ Pacific/Numea
(GMT+11:00) なので時間が正しく表示されますが、実際の解決策やバグがあればそれを知りたいと思っています。
OS が使用しているタイムゾーン ルールを再確認すると役立つ場合があります。
/usr/bin/zdump -v /etc/localtime | less
このファイルには、2080 年のような夏時間ルールが含まれている必要があります。
/etc/localtime Sun Mar 31 01:00:00 2080 UTC = Sun Mar 31 02:00:00 2080 BST isdst=1 gmtoff=3600
これを、使用する必要があると考えられるタイムゾーン ルールと比較できます。それらは次の場所にあります。 /usr/share/zoneinfo/.