質問

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/.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top