2017-08-17 3 views
1

Die für Muster "yyyy_'w'w" kann den Wert, den es analysiert hat, nicht formatieren.DateTimeFormatter kann für dieselbe Eingabe analysieren, aber nicht formatieren

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) 

Der Fehler ist:

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) 

Warum ist das?

+1

Welche Sprache ist das? Scala? (Nicht, dass es wirklich wichtig für Ihre Frage ist, es ist nur schwierig für einen Java-Ingenieur zu lesen.) Wenn Sie keine nützliche Antwort erhalten, können Sie es in Java übersetzen, um ein breiteres Publikum zu erreichen. –

Antwort

1

Das Muster yyyy repräsentiert die year-of-era field. Aber according to javadoc, gibt es auch das Muster uuuu, um die year field darzustellen (lesen Sie diese Verbindungen, um den kleinen Unterschied zwischen ihnen zu sehen - obwohl für aktuelle Daten es keinen großen Unterschied gibt).

Das Problem ist: Wenn Sie eine Formatierer mit y erstellen, verwendet es das Jahr-of-Ära Feld, wie Sie durch den Wert sehen:

Wert (YearOfEra, 4, 19, EXCEEDS_PAD)

Aber beim Parsen, das resultierende analysiert Objekt (in Ihrem Fall die week Variable) mit dem Jahr Feld erstellt - wie Sie durch die sehen können Wert:

{Jahr = 2017 ...


Der Formatierer wird mit dem Jahr-of-Ära Feld gesetzt. Wenn Sie also versuchen, week zu formatieren, versucht es, dieses Feld von der week-Variable abzurufen. Da dieses Feld nicht existiert (week enthält nur Jahr, aber nicht Jahr-der-Ära), wirft es die UnsupportedTemporalTypeException.

Die Lösung ist das Jahr Feld (das u Muster) in dem Formatierer zu verwenden:

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

Der Ausgang wird:

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

Beachten Sie, dass jetzt die Forma mit dem Jahr Feld und die format Methode nun erstellt wurde versucht, dieses Feld aus dem analysierten Objekt zu erhalten, und keine Ausnahme ausgelöst.

+1

Tolle Arbeit Hugo! Ich habe es genossen. – Synesso

0

Für mich können Sie einen DateTimeFormatter nicht verwenden, um einen TemporalAccessor zu formatieren, der eine zu breite Schnittstelle für Zeit ist. Versuchen Sie, es zuerst auf ein DateTime-Objekt zu übertragen.

Verwandte Themen