Generische Unterstützung für das ISO 8601-Format in Java 6

8

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:

  1. Das Feld "Minuten" ist optional (d. h. zweistellige statt vierstellige Zeitzonen sind gültig)
  2. Ein Doppelzeichen (':') kann verwendet werden, um das zweistellige Feld "Stunden" vom zweistelligen Feld "Minuten" zu trennen.

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:

  1. -08
  2. -0800
  3. -08: 00

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:

%Vor%

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

instanziiert sind %Vor%

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

festgelegt %Vor%

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).

    
PNS 23.10.2012, 22:11
quelle

1 Antwort

4

Scheint, dass Sie das verwenden können:

%Vor%     
ggrandes 05.01.2013, 22:33
quelle