TL; DR
Instant.now()
- Update UTCであなたのJVMのtzdata
- 作業、特にあなたのログ
- Serializeを
Date
クラス
0 ISO 8601フォーマットには、
新しいDate()は常に現在のシステム日付を返さないはずですか?
はい、Date
クラスは、現在の瞬間を常にUTCで取得します。それを繰り返してみましょう:Date
はUTCでの瞬間をキャプチャします。
トラブルがJVMの現在のデフォルトのタイムゾーンは、その文字列を生成する際に適用されるクラスのtoString
方法の善意が、不幸な「機能」から来ています。これは時代遅れで厄介なクラスを避けるための多くの理由の1つです。
"tzdata"タイムゾーンデータファイルが古く、DSTカットオーバの新しい日付を認識していない可能性があります。起動時
再起動JVM
Javaの実装は、典型的には、ホストOSから自分の現在のデフォルトのタイムゾーンを拾います。 JVM後、ホストOSのタイムゾーンを変更してもJVMには影響しません。
JVMを再起動して、ホストOSで新しいゾーン設定を取得します。サーバ
ベストプラクティスに
使用UTCは、UTCにサーバーを設定することが通常です。次に、夏時間のナンセンスについて心配する必要はありません。あなたのプログラミング、ロギング、cronジョブ、データ交換、およびデータのシリアル化の大部分はUTCであるべきUTC
で
作業。
例えば、Stack Overflowが "today"と "yesterday"のアクティビティを報告する際にUTCをどのように使用するかを注意してください。 UTCをThe One True Timeと考えることを学ぶ。すべてのゾーンはそのテーマのバリエーションです。
特定のゾーンを予期しているユーザーにプレゼンテーションなどのクリティカルな場所にのみタイムゾーンを適用します。
あなたの問題は、時空の曲げによるものではなかったことに注意してください。秒、分、および時間は、通常どおり、ティック・トック・ティック・トックをUTCの点で増加し続けました。あなたの問題は、タイムゾーンルールの変更データが古くなっているタイムゾーンに間違っていました。
は、Javaコード内でご希望のゾーンを指定
あなたのJavaアプリケーションは、常に自分の希望/目的とする時間帯を明示的に指定する必要があります。これを省略すると、JVMの現在のデフォルトのタイムゾーンが暗黙的に適用されます。
JVMのデフォルトは、JVM内の任意のアプリケーションの任意のスレッドの任意のコードによっていつでも変更でき、そのJVM内の他のすべてのコードに即座に影響します。だから、重要なことのためにその現在のデフォルトに決して依存しないでください。ユーザーと確認し、コードに明示的に指定します。
避けレガシー日時クラス
Date
とCalendar
を含む古い日付時刻クラスは血まみれです。それらを避けてください。それらは今や古くなり、java.timeクラスに取って代わられています。
Instant
クラスはナノ秒単位の分解能を持つタイムライン上の瞬間です。常にUTCです。
Instant instant = Instant.now() ;
は
toString
を呼び出し、標準のISO 8601フォーマットされた文字列を生成するには。最後の
Z
はズールーの略でUTCを意味します。
String output = instant.toString() ;
2017-01-23T12:34:あなたの全体の問題を回避するコードのこれら2本の単純なラインを使用して56.123456789Z
。
しかし、あなたは日常でのtzdataを更新する必要があります。
- ホストOS
- JVM
- データベースシステム(Postgresの、など)などジョダタイムとして
- ライブラリ
おそらく何も変わらないでしょうが、代わりに 'LocalDateTime.now()'を試すことができますか?私は 'Date API'がちょっとしたバグ/欠陥があると聞いたことを覚えています。 – smttsp