Java 7 hat die Unterstützung in der Klasse SimpleDateFormat
für das ISO 8601-Format über das Zeichen X
(anstelle von Klein- oder Großbuchstaben Z
) eingeführt. Die Unterstützung solcher Formate in Java 6 erfordert eine Vorverarbeitung, daher ist die Frage die beste Vorgehensweise.
Dieses neue Format ist eine Obermenge von Z
(Großbuchstabe Z) mit zwei zusätzlichen Varianten:
Also, wie man in der Java 7 Dokumentation von SimpleDateFormat
sehen kann , die folgenden 3 Formate sind jetzt gültig (anstatt nur die zweite, die von Z
in Java 6 abgedeckt wird) und natürlich äquivalent:
Wie in einer früheren Frage besprochen ein spezieller Fall der Unterstützung eines solchen "erweiterten" Zeitzonenformats, immer mit ":" als Trennzeichen, ist der beste Ansatz für die Rückportierung der Java 7-Funktionalität in Java 6 die Unterklasse der SimpleDateformat
-Klasse und die Außerkraftsetzung ihrer parse()
-Methode. zB:
Beachten Sie, dass die Unterklasse SimpleDateFormat
Objects mit dem entsprechenden Z
-basierten Muster initialisiert werden müssen, dh wenn die Unterklasse ExtendedSimpleDateformat
ist und Sie Daten analysieren wollen, die dem Muster yyyy-MM-dd'T'HH:mm:ssX
entsprechen, dann sollten Sie Verwenden Sie Objekte, die als
In der oben erwähnten früheren Frage der Regex :(?=[0-9]{2}$)
wurde vorgeschlagen, um das ':' und in einer ähnlich zu machen Frage Die Regex (?<=[+-]\d{2})$
wurde vorgeschlagen, um das "Minuten" -Feld als 00
anzuhängen, falls nötig.
Offensichtlich kann die erfolgreiche Ausführung der zwei Ersetzungen zum Erzielen der vollen Funktionalität verwendet werden. Die lokale Variable iso
in der überschriebenen Methode parse()
würde als
oder
%Vor% mit einer if
Überprüfung dazwischen, um sicherzustellen, dass der pos
-Wert auch später richtig eingestellt wird und auch für den length()
Vergleich früher.
Die Frage ist: Können wir einen einzelnen regulären Ausdruck verwenden, um den gleichen Effekt zu erzielen, einschließlich der Informationen, um die Länge nicht unnötig zu überprüfen und pos
ein paar Zeilen später korrekt zu setzen? / p>
Die Implementierung ist für Code vorgesehen, der eine große Anzahl von Zeichenfolgenfeldern liest, die in einem beliebigen Format (sogar vollständig nicht-Datum) vorliegen können, nur diejenigen auswählen, die dem Format entsprechen, und das analysierte Java Date
-Objekt zurückgibt / p>
Daher sind sowohl Genauigkeit als auch Geschwindigkeit von höchster Wichtigkeit (d. h., wenn die Verwendung der zwei Durchläufe schneller ist, ist dieser Ansatz vorzuziehen).
Tags und Links java regex date simpledateformat java-6