Frage

Gibt es eine Möglichkeit, Joda Zeit zu zwingen, Daten nur dann zu analysieren, wenn sie vier Ziffernjahre enthalten? Zum Beispiel:

  • 2009-11-11-sollte analysieren
  • 09-11-11-sollte nicht analysieren

Ausprobiert den folgenden Code:

DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
DateTimeFormatter formatter = builder.appendYear(4, 4).appendLiteral('-').appendMonthOfYear(1).appendLiteral('-').appendDayOfMonth(1).toFormatter();
formatter.parseDateTime("09-11-11");

Parsen in 0009-11-11. Anscheinend werden Mindigits in der Methode appendyear nur zum Formatieren verwendet, wenn das Datum ausgedruckt ist.
Das Ergebnis ist das gleiche, wenn ich appendyearoFera () verwende. Wenn ich appendyearof Century () verwende, analysiert es stattdessen das Jahr in 1909.

Wir implementieren einen allgemeinen Datenparser, der verschiedene Arten von Eingaben erkennt. Auch das Beispiel ist eine verkürzte Form des realen Deals (zum Einfachheit halber). Szenarien im wirklichen Leben Parsen Daten, die Wochentage, Monate als Wörter, Zeit, Zone und verschiedene Charaktere haben können, die Monat, Tag und Jahr trennen. Daher kann das Schreiben eines Regex oder das Überprüfen des Inhalts/der Länge der Zeichenfolge sich als ziemlich schwierig erweisen.

Einige echte Beispiele könnten so aussehen:

  • 2009-11-11
  • Mittwoch 2009-11-11t15: 00: 00: 00
  • 2009/11/11 15:00
  • und viele mehr...
War es hilfreich?

Lösung

DateTimeFormatterBuilder.AppendfixedDecimal () kann durchaus das tun, was Sie brauchen.

Alternativ können Sie die DateTimeParser -Schnittstelle implementieren, um den gewünschten Parser zu erstellen, und diese an den DateTimeFormatterBuilder übergeben.

Andere Tipps

Sie können die Länge der Datumszeichenfolge überprüfen.

Sie können extrem spezifische Parsers und Formatierungen verwenden DateTimeFormatterBuilder. Es ist im Allgemeinen nicht erforderlich, diese Klasse direkt zu verwenden, da die meisten gängigen Formate an anderer Stelle in der API leichter verfügbar sind. Dies ist jedoch die Builder -Klasse, die sie alle unter den Cover verwenden.

Was möchten Sie von einem Benutzer bekommen, der als Datum '0001-01-01' eingibt (dh, sie haben 4 Ziffern für das Jahr eingegeben, aber die ersten drei waren Nullen)? Was ist mit '0999-12-31'? Und '999-12-31'? Und was ist mit '10000-01-01'-dem berüchtigten Y10K1 Problem?

  • Wenn dies ein legitimer Wert ist, entdecken Sie die Länge dessen, was der Benutzer als Jahresabschnitt des Datums tippt (wahrscheinlich nach einer anderen Analyse) und sicherzustellen ?) vier Stellen.

  • Wenn dies kein legitimer Wert ist, sind Sie nach der Analyse des Datums bei der Überprüfung des Jahreswerts fest.

  • Oder Sie können den Code einnehmen und ändern, damit er Ihre bevorzugte Definition des gültigen Jahres enthält.


1 Ich habe nicht vor, das Y10K-Problem vor 5000-01-02 zu beheben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top