web-dev-qa-db-ja.com

日付をISO8601Zulu文字列からJava.time.Instantin Java 8に変換します

文字列の日付形式をJava.time.Instantに変換したい

日付の解析中に例外が発生します。

 Java.lang.IllegalArgumentException: Too many pattern letters: s

最初に文字列から日付に変換するために、以下のコードを使用しています。

    String string = "2018-07-17T09:59:51.312Z";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("YYYY-MM-DD'T'hh:mm:ss.sssZ", Locale.FRANCE);
    LocalDate date = LocalDate.parse(string, formatter);
    System.out.println(date);

「タイムスタンプ」を変換したい:"2018-07-17T09:59:51.312Z" ISO8601形式の形式時間でYYYY-MM-DDThh:mm:ss.sssZUTCタイムゾーン。

チェック済み Java文字列から日付への変換 ですが、機能していません。

7
surendrapanday

tl; dr

文字列の日付形式をJava.time.Instantに変換します

書式設定パターンをスキップします。解析するだけです。

Instant.parse( "2018-07-17T09:59:51.312Z" )

ISO 8601

はい、 最初の回答 に示されているように誤ったフォーマットパターンを使用しました。

ただし、フォーマットパターンを指定する必要はまったくありません。入力文字列は標準の ISO 8601 形式です。Java.timeクラスは、文字列の解析/生成時にデフォルトでISO8601形式を使用します。

最後のZ[〜#〜] utc [〜#〜] を意味し、「Zulu」と発音されます。

Instant instant = Instant.parse( "2018-07-17T09:59:51.312Z" ) ;

Java.timeについて

Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは厄介な古い legacyJava.util.DateCalendar 、& SimpleDateFormat などの日時クラス。

Joda-Time プロジェクトは現在 メンテナンスモード であり、 Java.time クラスへの移行をアドバイスします。

詳細については、 Oracle Tutorial を参照してください。多くの例と説明については、Stack Overflowを検索してください。仕様は JSR 310 です。

Java.timeオブジェクトをデータベースと直接交換できます。 JDBCドライバーJDBC 4.2 以降に準拠)を使用します。文字列やJava.sql.*クラスは必要ありません。

Java.timeクラスはどこで入手できますか?

ThreeTen-Extra プロジェクトは、Java.timeを追加のクラスで拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある試験場です。ここには、 IntervalYearWeekYearQuartermore )などの便利なクラスがあります。

6
Basil Bourque

独自のフォーマッタを作成しないでください

独自のフォーマットパターン文字列を書くのに苦労しないでください。文字列は、Java.timeに組み込まれているISO8601形式です。 Java.time.Instantに解析するには(タイトルにあるように):

    String string = "2018-07-17T09:59:51.312Z";
    Instant inst = Instant.parse(string);
    System.out.println(inst);

出力:

2018-07-17T09:59:51.312Z

LocalDateに解析するには(コードスニペットが意図しているように見えます):

    LocalDate date = LocalDate.parse(string, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
    System.out.println(date);

2018-07-17

コードで何が問題になりましたか?

フォーマットパターンの文字では大文字と小文字が区別されます(リンク先の質問に対する最初の回答の表からも確認できます)。

  • 年に大文字のYYYYを使用しました。大文字のYは週の年を表し、週番号でのみ役立ちます。年にはuuuuまたは小文字のyyyyを使用します。
  • 大文字のDDは年の日を表します。曜日には小文字のddが必要です。
  • 小文字のhhは、AMまたはPM 01から12までで、AM/PMマーカーでのみ役立ちます。時間帯には大文字のHHが必要です。 00から23まで。
  • 最後に、小文字のssを秒単位で正しく使用しましたが、sssを秒単位で使用しました。後者の場合、大文字のSSSが必要です。このエラーがエラーメッセージの理由です。秒は60秒(うるう秒を含む)までしか上がらないため、sのように3つのsssは意味がなく、DateTimeFormatterこれに反対します。ドキュメントから:

    'd'、 'H'、 'h'、 'K'、 'k'、 'm'、および 's'の2文字まで指定できます。

リンク: DateTimeFormatterドキュメント

1
Ole V.V.