解析しようとしています: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桁では機能しません。
何か案は?
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のバックポートはそうではないようですしかし利用可能。
SimpleDateFormat
符号のオフセットはZ
check Java7
または Java8
SimpleDateFormat 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
です。