web-dev-qa-db-ja.com

タイムゾーンオフセットのjava.time DateTimeFormatterパターン

解析しようとしています:2014-05-02-10.45.05.993280-5:00 どこ -5:00はUTCからのオフセットです。 Java.timeの使用 DateTimeFormatter in Java 8。

最初のビットには次のものがあります:yyyy-MM-dd-HH.mm.ss.SSSSSSただし、オフセットを解析するためのパターンを把握することはできません。

4桁のオフセット(-05:00)がある場合は、yyyy-MM-dd-HH.mm.ss.SSSSSSxxx、ただしこれは3桁では機能しません。

何か案は?

15
Cheetah

Xの代わりに大文字のXを使用します。したがって、XXXです。違いは、大きなXは入力文字「Z」をUTCオフセット+00:00として認識できるのに対し、小さなパターン文字Xは認識できないことです。

推奨パターン:

_yyyy-MM-dd-HH.mm.ss.SSSSSSXXX
_

次の JDK-bug にも注意してください。

Java.time.format.DateTimeFormatterは、1桁の時間を持つオフセットを解析できません

UPDATE:

バグログに記載されている回避策をテストしました。

_String input = "2014-05-02-10.45.05.993280-5:00";
DateTimeFormatter f = new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd-HH.mm.ss.SSSSSS").parseLenient().appendOffset("+HH:MM", "Z").toFormatter();
System.out.println(f.parse(input, ZonedDateTime::from));
_

ただし、例外がスローされます:

スレッド「メイン」の例外Java.time.format.DateTimeParseException:テキスト '2014-05-02-10.45.05.993280-5:00'は、Java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter。のインデックス26で解析できませんでした。 Java:1947)at Java.time.format.DateTimeFormatter.parse(DateTimeFormatter.Java:1849)at HelloWorld.main(HelloWorld.Java:16)

そのため、寛容な解析も役に立たない。 だから、3つのオプションしか残っていません:

  • バグレポーターが提案する回避策を使用します。[...]回避策は、日付/時刻を個別に解析し、オフセットに手動でコード化されたパーサーを使用し、LocalDateTimeを手動で解析されたオフセットと組み合わせます。簡単な回避策ではありません。

  • 独自の特殊な文字列前処理を試してください。固定形式の場合は、26桁目にゼロ桁を挿入しようとすることができます(合計入力長が1桁短すぎる場合)。

  • または、これを行うことができる外部ライブラリを使用します。私のライブラリTime4J(v4.0)は、追加の依存関係を追加したい場合にそれを行うことができます。このコードを参照してください:

String input = "2014-05-02-10.45.05.993280-5:00"; ZonalDateTime zdt = ZonalDateTime.parse( input, Moment.localFormatter("yyyy-MM-dd-HH.mm.ss.SSSSSSXXX", PatternType.CLDR)); System.out.println(zdt); // 2014-05-02T10:45:05,993280UTC-05:00 ZonedDateTime result = zdt.toTemporalAccessor();

更新:JDK-bug-statusによれば、Java-9のバグは修正されていますが、Java-8のバックポートはそうではないようですしかし利用可能。

17
Meno Hochschild

SimpleDateFormat符号のオフセットはZcheck Java7 または Java8SimpleDateFormat API

次に、Stringのパーサー形式

2014-05-02-10.45.05.993280-5:00

でなければなりません:

yyyy-MM-dd-HH.mm.ss.SSSSSSZ

[〜#〜] update [〜#〜]:for DateTimeFormatter for offsetパターン書式設定と解析は次のとおりです。

O       localized zone-offset       offset-O          GMT+8; GMT+08:00; UTC-08:00;
X       zone-offset 'Z' for zero    offset-X          Z; -08; -0830; -08:30; -083015; -08:30:15;
x       zone-offset                 offset-x          +0000; -08; -0830; -08:30; -083015; -08:30:15;
Z       zone-offset                 offset-Z          +0000; -0800; -08:00;

DateTimeFormatterで必要なパターンはXです。

3
Jordi Castilla