web-dev-qa-db-ja.com

Java 8 Date and TimeAPI-解析yyyy-MM-dd'T'HH:mm:ss.SSSZ

ISO8601形式で日付を解析しようとしています:

yyyy-MM-dd'T'HH:mm:ss.SSSZ

Java.time.format.DateTimeFormatterで定義されているデフォルトの形式では解析できないというのは正しいですか?

たとえば、ISO_OFFSET_DATE_TIMEは以下のみを解析します。

yyyy-MM-dd'T'HH:mm:ss.SSSZZ

サンプル:

yyyy-MM-dd'T'HH:mm:ss.SSSZ
2015-04-29T10:15:00.500+0000

yyyy-MM-dd'T'HH:mm:ss.SSSZZ
2015-04-29T10:15:00.500+00:00

ところで:私は問題ではない自分のフォーマッターを定義できることを知っています。 JodaISODateTimeFormatは両方を解析できるため、何かが欠落していないことを確認したかっただけです。

 org.joda.time.format.DateTimeFormatter dateTimeFormatter = ISODateTimeFormat.dateTime();
 DateTime dateTime = dateTimeFormatter.parseDateTime("2015-04-29T10:15:00.500+0000");
11
vehovmar

これらの煩わしい日付形式に煩わされることはありません。

新しいライブラリがあります dateparser

任意のStringを自動的に認識し、それをDateカレンダーLocalDateTimeOffsetDateTime正しく。

これを使用すると、yyyy-MM-dd'T'HH:mm:ss.SSSZyyyy-MM-dd'T'HH:mm:ss.SSSZZのような適切なパターンを準備する必要はありません。

Date date = DateParserUtils.parseDate("2015-04-29T10:15:00.500+0000");
Calendar calendar = DateParserUtils.parseCalendar("2015-04-29T10:15:00.500Z");
LocalDateTime dateTime = DateParserUtils.parseDateTime("2015-04-29 10:15:00.500 +00:00");

すべて正常に動作しますので、お楽しみください。

1
sulin

これがあなたの期待する答えかどうかはわかりません。

方法1

Instantを使用して解析する

Instant.parse("2015-06-28T10:13:14.743Z");

方法2

指定された入力形式は、指定されたパターンyyyy-MM-dd'T'HH:mm:ss.SSSZから 'Z'を削除した後のISO_DATE_TIME形式と同等です。

次に、ISO_DATE_TIMEを使用して解析できます

 text = "2015-06-28T10:13:14.743"
 LocalDateTime.parse(text,DateTimeFormatter.ISO_DATE_TIME)
5
nantitv

これはデフォルトのフォーマットのいずれとも一致しないように見えるという点で正しいので、Java.time.format.DateTimeFormatterBuilderを使用してフォーマットを作成する必要があります。

4
llogiq

Jodaは、デフォルトのISODateTimeFormatにISO8601形式を使用します。したがって、ドキュメント http://www.w3.org/TR/NOTE-datetime に基づくと、Jodaはフォーマットを解析できません。