2012-02-24 7 views
5

DateというクラスのインスタンスのtoStringメソッドを呼び出して取得した文字列があります。
この文字列からDateオブジェクトを取得するにはどうすればよいですか?Date.toStringをDateに戻すにはどうすればいいですか?

Date d = new Date(); 
String s = d.toString; 
Date theSameDate = ... 

UPDATE
)私はてSimpleDateFormatを使用しようとしましたが、私はjava.text.ParseException: Unparseable date はあなたが私にDate.toString(によって生成日付形式を伝えることができ得ますか?

+0

たとえば、 'SimpleDateFormat'を使って解析してみてください。 – bdares

+1

文字列を使用しないでください。 Dateオブジェクトを保持し、必要なときにのみStringに変換します。 – m0skit0

+1

あなたが実際に達成しようとしていることにいくつかのコンテキストを提供することは良い考えです。 – flesk

答えて

12

、簡単な解決策は次のようになります。

Date d = new Date(); 
long l = d.getTime(); 
Date theSameDate = new Date(l); 
+1

FYI:厄介な 'Date'クラスは、' Instant'と他の* java.time *クラスに置き換えられました。 Ole V.V.による[この回答](https://en.m.wikipedia.org/wiki/ISO_8601)の現代的なアプローチを見てください。 –

2

SimpleDateFormat#parse()をご覧ください。それはあなたが探している機能を提供するはずです。いくつかのそれほど明白ではない理由から

+0

このクラスは現在、 'DateTimeFormatter'によって時代遅れになっています。 –

-1

Date theSameDate = new Date(Date.parse(s));

、これは特に良いアイデアではありません。詳細については、APIドキュメントのparseメソッドを参照してください。 1つの問題は、タイムゾーンの略語があいまいであるため、パーサーが正しいタイムゾーンの解釈に失敗する可能性があります。あなたの本当の目標は、カスタムメイドの持続性やデータ転送のいくつかの種類のためのDateオブジェクトをシリアル化する場合

+0

また、 'Date.parse()'はずっと前から廃止されました。 –

8

あなたはこの

Date d = new Date(); 
String s = d.toString; 
Date theSameDate = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy").parse(s); 
+0

このメソッドは、JSONObjectsを構築するときにDate.toString()を使用するため、Beanコンストラクタを使用してJava DateオブジェクトをJSONObjectsに変換するときにorg.jsonライブラリでも機能します。ありがとう、これは私が探していたSimpleDateFormatの形式です。 –

+0

FYI、ここで使われている厄介な古いクラスは、今や古くから* java.time *クラスに取って代わられています。 –

2
ようにそれを行うことができます
  1. 日付と時刻をシリアル化および逆シリアル化する(データ転送や永続化などの)場合は、日付と時刻のデータの標準形式であるISO 8601にシリアル化してください。
  2. 古い古くなった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.timeSedalb’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という名前でした)。

+1

tl; dr 'Instant.parse(Instant.now()。toString())' –

関連する問題