2017-08-17 9 views
1

"yyyy_'w'w"DateTimeFormatterは、解析した値を書式設定できません。DateTimeFormatterは解析できますが、同じ入力に対しては書式設定できません

val df = DateTimeFormatter.ofPattern("yyyy_'w'w") 
df: DateTimeFormatter = Value(YearOfEra,4,19,EXCEEDS_PAD)'_''w'Localized(WeekOfWeekBasedYear,1) 

val week = df.parse("2017_w19") 
week: temporal.TemporalAccessor = {Year=2017, WeekOfWeekBasedYear[WeekFields[SUNDAY,1]]=19},ISO 

df.format(week) 

エラーは次のとおりです。

java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra 
    java.time.format.Parsed.getLong(Parsed.java:203) 
    java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298) 
    java.time.format.DateTimeFormatterBuilder$NumberPrinterParser.format(DateTimeFormatterBuilder.java:2540) 
    java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2179) 
    java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1746) 
    java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1720) 

これはなぜでしょうか?

+1

どのような言語ですか?スカラ? (あなたの質問では重要ではありませんが、Javaのエンジニアが読むのは難しいことです)。有用な答えが得られない場合は、それをJavaに翻訳してより広いオーディエンスになるかもしれません。 –

答えて

1

パターンyyyyは、year-of-era fieldを表す。しかし、according to javadocの場合は、year fieldを表すパターンuuuuもあります(それらの小さな違いを見るためにリンクを読んでください - 現在の日付はそれほど違いはありません)。

問題がある:あなたがyとフォーマッタを作成するときに値で見ることができるように、それは、年の時代フィールドを使用しています。

値(YearOfEra、4、 19、EXCEEDS_PAD)

しかし、解析するとき、結果の解析されたオブジェクトは、(あなたのケースでは、week変数)フィールドを使用して作成された - あなたはで見ることができるように値:

{ = 2017、...


フォーマッタは、年の時代フィールドに設定されています。したがって、weekをフォーマットしようとすると、week変数からこのフィールドを取得しようとします。このフィールドは存在しないため(weekしか含まれていませんが、の年齢はではありません)、UnsupportedTemporalTypeExceptionがスローされます。

ソリューションは、フォーマッタでフィールド(uパターン)を使用することです:

val df = DateTimeFormatter.ofPattern("uuuu_'w'w") 
println(df) 
val week = df.parse("2017_w19") 
println(week) 
println(df.format(week)) 

出力は次のようになります。

値(、4,19 、EXCEEDS_PAD) '_' 'w'Localized(WeekOfWeekBasedYear、1)
{ = 2017、WeekOfWeekBasedYear [WeekFields [SUNDAY、1] ] = 19}、ISO
2017_w19

今フォーマッタがフィールドを使用して作成されたノート、そしてformat方法について解析されたオブジェクトからこのフィールドを取得しようとすると、例外はスローされません。

+1

素晴らしい作品ヒューゴ!私はこれを楽しんだ。 – Synesso

0

私にとっては、TimeTimeFormatterを使用してTemporalAccessorをフォーマットすることはできません.TemporalAccessorは時間的には広すぎます。最初にDateTimeオブジェクトにキャストしようとします。

関連する問題