3

このコードを Windows マシンで実行すると、正しく動作します。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(new Date()));

時計と同じ日付と時刻が表示されますが、Windows Server で実行すると同じコードが表示され、-2 時間の時刻が表示されます。

タイムゾーンを次のように設定してみましたが、

TimeZone timeZone = TimeZone.getTimeZone("Europe/Vienna");
sdf.setTimeZone(timeZone);
Then, it shows same as clock time.

私の疑問は、Windows Server でデフォルトで時計のタイム ゾーンを使用しない理由です。

4

4 に答える 4

3

常に実行中のマシンのタイム ゾーンを使用する必要がありますが、ここここで報告されているように、場合によっては失敗します。サーバーのタイム ゾーンが正しく、Java が別のタイム ゾーンを使用していることが確実な場合は、コマンド ラインから選択したデフォルトのタイム ゾーンを強制できます。

-Duser.timezone="YOUR_TIME_ZONE_HERE"

またはコードで。Oracle のTimezone Updater Toolを試すこともできます。

Java で使用されるタイム ゾーンを表示するには、次のようにします。

System.out.println(TimeZone.getDefault());
于 2013-04-30T14:37:24.150 に答える
2

タイム ゾーンの設定は、コンピューターが認識する時間の値には影響しません。詳細については、こちらの回答を参照してください。システム時刻が (タイム ゾーンに関係なく) 適切に設定されていて、時刻をテキストとして表示したり、テキストから時刻を解析したりする必要がない限り、Java で問題は発生せず、計算も正しく行われます。時間の値を表示/解析する必要がある場合は、デフォルトのタイムゾーンを設定しても安全であり、時間の保存方法には影響しません。ただし、Java はそのタイムゾーンを使用して、明示的に示されていない時間のテキスト表現を解析します。タイムゾーンを指定します(SimpleDateFormatフォーマット文字列にタイムゾーンが含まれていないため、例で を使用して解析した場合のように)。

サーバー ボックスでは Java がこの問題を抱えているのに、デスクトップ ボックスでは問題が発生しない理由について、それはどのバージョンの Windows Server で、サーバーで実行されている Java のバージョンは何ですか? 私の推測では、JVM は OS のバージョンを明確に識別できないため、ローカル タイム ゾーンを取得する方法を確実に知ることができないため、UTC をフォールバックとして使用します。Java のバージョンを最新のものに更新してみてください。

もう 1 つの可能性は、サーバーのタイム ゾーンがユーザーごとに設定されていることです。サーバー上でアプリを実行しているユーザー/プロセスのタイム ゾーンが正しく設定されていることを確認します。

于 2013-04-30T16:29:27.960 に答える
1

2003 サーバーから 2008 サーバーにアップグレードした後、この問題が発生しました。Java は、Windows タイムゾーン設定の代わりに GMT タイムゾーンを使用し続けます。解決策は簡単です。Windows のコントロール パネルに移動し、別のタイムゾーンに変更してから (タイムゾーンが何であれ)、元に戻します。それを理解するのに何時間もかかりましたが、それは魅力的でした.

私の考え: 変更は Java で何かを引き起こし、問題を修正しました。

于 2015-12-11T01:08:08.327 に答える