ようにそれを行うことができます
- 日付と時刻をシリアル化および逆シリアル化する(データ転送や永続化などの)場合は、日付と時刻のデータの標準形式であるISO 8601にシリアル化してください。
- 古い古くなった
Date
クラスはスキップしてください。 java.time
として知られている現代のJavaの日時APIは、使用するのがずっとうれしいです。あなたがそれから必要とするクラスはおそらくInstant
です(これはあなたのより厳密な要求に依存します)。
2つの点が手にきれいに手を行く:
Instant i = Instant.now();
String s = i.toString();
Instant theSameInstant = Instant.parse(s);
近代クラスtoString
方法はISO 8601形式(例えば、2018-01-11T10:59:45.036Z
)を生成し、そのparse
方法は戻って同じ形式をお読みください。このスニペットは必要なものだけで、最初のものと瞬間的に等しく、ナノ秒の精度で取得できます。
あなたが得る文字列を制御することはできません、あなたはあまりにもjava.time
とSedalb’s answer作品に、Date.toString()
からフォーマットパターン文字列を結果が出た場合:
DateTimeFormatter dtf
= DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ROOT);
Date d = new Date();
String s = d.toString();
Instant nearlyTheSameInstant = ZonedDateTime.parse(s, dtf).toInstant();
それはロケールを提供することが不可欠です。それ以外の場合は、JVMのデフォルトロケールが使用され、英語でない場合は解析が失敗します。最悪の場合、あなたのコードは何年もうまく動作していて、いつか誰かが別のロケール設定のコンピュータやデバイスでそれを実行したときに壊れてしまいます。
jambjo’s answerからのポイントは、まだ適用されます。Date.toString()
で使用される3〜4文字のタイムゾーンの略語は非常にしばしばあいまいであるので、そこにタイムゾーンが正しく解釈されるという保証はありません、そして再び、それは異なって解釈されます異なるJVM上にある。
最後に、Date.toString()
は、Date
が保持するミリ秒を表示しないため、最大999ミリ秒の不正確さが発生します。 Date.toString()
の文字列を使用している場合、私たちができることは何もありません(これが変数nearlyTheSameInstant
という名前でした)。
たとえば、 'SimpleDateFormat'を使って解析してみてください。 – bdares
文字列を使用しないでください。 Dateオブジェクトを保持し、必要なときにのみStringに変換します。 – m0skit0
あなたが実際に達成しようとしていることにいくつかのコンテキストを提供することは良い考えです。 – flesk