34

Tomcat アプリケーションを実行していて、いくつかの時間値を表示する必要があります。残念ながら、時間は 1 時間遅れています。調べたところ、デフォルトの TimeZone が次のように設定されていることがわかりました。

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 に太平洋標準時を使用するようにどこで指示すればよいかということです。プログラムによるソリューションを探しているのではなく、構成ソリューションである必要があります。

4

5 に答える 5

29

これは、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」を追加しました。

于 2008-08-09T00:46:46.260 に答える
26

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からデフォルトのタイムゾーンを読み取るようです。

于 2010-10-12T08:15:01.203 に答える
3

私も同様の問題を抱えていました。おそらく同じ問題です。ただし、TomcatサーバーはWindowsボックスで実行されるため、シンボリックリンクソリューションは機能しません。

私は設定-Duser.timezone=Australia/SydneyしましたJAVA_OPTSが、TomcatはDSTが有効であることを認識しませんでした。回避策として、Australia/Sydney(GMT + 10:00)をPacific/Numea(GMT + 11:00)に変更して、時刻が正しく表示されるようにしましたが、実際の解決策やバグがある場合は知りたいと思います。

于 2008-10-08T12:18:05.090 に答える
0

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/にあります。

于 2008-08-09T01:01:17.587 に答える