2017-11-23 4 views
0

これは何度か尋ねられていますが、私はdownvote/duplicate closeを危険にさらしていますが、ここに投稿された質問のほとんどはyyyy..soにYYYYをchaing、検索は本当に助けにはならない:/Java SimpleDateFormatが正しく解析されません(大文字/小文字が正しく入力されています)。

これらは、ブロック内の特定のタイムスタンプがある

date new Block: 2017-11-02T06:17:05.079481 
date old Block: 2017-11-02T06:17:04.608960 

マイ変換コード:

public static Date getDate(JSONObject block){ 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS"); 
    try { 
     return sdf.parse(block.get("timestamp").toString()); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
     return new Date(0); 
    } 
} 

これは解析の結果です

date new block: Thu Nov 02 06:18:24 KST 2017 
date old block: Thu Nov 02 06:27:12 KST 2017 

これはどのように可能ですか?新しいブロックは、タイムスタンプに見られるように、古いブロックの後に作成されました。しかし、今、それは周りの

+0

月の日を小文字の「d」で表します。 – Lothar

+0

「DD」の代わりにddを使用します。 –

+0

「SimpleDateFormat Javaの使用方法」(https://docs.oracle.com/javase/7/docs/)を検索します。 api/java/text/SimpleDateFormat.html)は役に立ちました。 – DevilsHnd

答えて

3

どうということは可能ですか?新しいブロックは、タイムスタンプに見られるように、古いブロックの前に作成されました。ではないあなたは、現時点で想定しているものであるだけで「第二の画分」 - しかし、今、それは周りの

SSimpleDateFormatフォーマット文字列内の他の方法は、常にミリ秒を表しています。

あなたの「新しい」ブロックが「古い」ブロックが結果を説明したが、前方にあなたの道を与えるものではありません608960.

を持っているのに対し、79481ミリ秒を追加することとして解析されています。 - これはナノ秒の精度の代わりに、ミリ秒の精度で、はるかに近代的なAPIである

  • 使用java.time.*:ここでは2つのオプションがあります。
  • 入力の最後の3文字を削除し、ミリ秒の精度で解析します。
+0

ありがとう、私はjava.timeを読む必要がありますね! – InDaPond

+1

@InDaPond:java.util.Date /CalendarよりもはるかにクリーンなAPIです...私は完全にそれまで一般的に移動することをお勧めします:) –

-1

あなたのシンプルな日付形式で、他の方法で、あなたは「のD-D」

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS"); 

を小文字に「DD」を変更する必要があるこれがうまくいけば、あなたの問題を解決します。

編集:時間は同じです。 ** ** 'HH''hh'(小文字)に置き換えてください。

おかげ

+0

これは間違った月の問題を解決しますが、タイムスタンプはまだ間違っています – InDaPond

+0

InDaPondは、上のコメントを編集しました。 確認して確認してください。 –

+0

JavaDocの外:時間(0-23)および時間(h/am/pm)。資本Hは正しいはずですか? – InDaPond

1

Jon Skeet’s knowledgable answerをフォローアップすると、java.timeを使用するのは難しくありません。 JSONブロックの日時フォーマットは、日付と時刻のデータ交換の標準フォーマットであるISO 8601です。java.timeクラスは、このフォーマットをデフォルトとして、つまり明示的なフォーマットを必要とせずに解析します。

String blockTimestamp = "2017-11-02T06:17:05.079481"; 
    LocalDateTime dateTime = LocalDateTime.parse(blockTimestamp); 

結果のdateTimeを印刷しようとすると、toStringメソッドが生成するものも2017-11-02T06:17:05.079481であるため、デフォルトの形式であるISO 8601が再び表示されます。

LocalDateTimeの潜在的な欠点は、タイムライン上の明白な点ではないことです。ですから、日付と時刻を解釈するには、タイムゾーンを知っていれば、あなたはおそらく、たとえば、ZonedDateTimeに変換することになるでしょう:

ZoneId koreaTimeZone = ZoneId.of("Asia/Seoul"); 
    ZonedDateTime koreaDateTime = dateTime.atZone(koreaTimeZone); 

これは2017-11-02T06:17:05.079481+09:00[Asia/Seoul]が得られます。

関連する問題