Lua ISO 8601 Datetime-Parsingmuster

8

Ich versuche, eine vollständige ISO8601-Datetime aus JSON-Daten in Lua zu parsen. Ich habe Probleme mit dem Spielmuster.

Bisher habe ich Folgendes:

%Vor%

Ich merke, wie ich mit der Zeitzone umgehen kann, weil es kein logisches oder das - oder + oder nichts gibt. Obwohl ich weiß, dass lua die Zeitzone in der Funktion os.time nicht unterstützt, würde ich zumindest wissen, wie es angepasst werden musste.

Ich habe darüber nachgedacht, nach dem "." (Millisekunden und Zeitzone), aber dann hätte ich wirklich keine gültige Datetime. Millisekunden sind nicht so wichtig und ich hätte nichts dagegen, es zu verlieren, aber die Zeitzone ändert Dinge.

Hinweis: Jemand hat vielleicht einen viel besseren Code dafür und ich bin nicht damit verheiratet, ich muss nur etwas nützliches aus der datetime Zeichenfolge herausholen:)

    
Brill Pappin 27.10.2011, 03:08
quelle

2 Antworten

10

Das vollständige ISO 8601-Format kann nicht mit einer einzelnen Musterübereinstimmung ausgeführt werden. Es gibt zu viel Variation.

Einige Beispiele von der Wikipedia-Seite :

  • Es gibt ein "komprimiertes" Format, das Zahlen nicht trennt: YYYYMMDD vs YYYY-MM-DD
  • Der Tag kann weggelassen werden: YYYY-MM-DD und YYYY-MM sind beide gültige Daten
  • Das Ordnungsdatum ist ebenfalls gültig: YYYY-DDD , wobei DDD der Tag des Jahres (1-365 / 6)
  • ist
  • Bei der Darstellung der Uhrzeit können die Minuten und Sekunden weggelassen werden: hh:mm:ss , hh:mm und hh sind alle gültigen Zeiten
  • Außerdem hat die Zeit auch eine komprimierte Version: hhmmss , hhmm
  • Darüber hinaus akzeptiert die Zeit Brüche, indem Sie sowohl den Punkt als auch das Komma verwenden, um Bruchteile des unteren Zeitelements im Zeitabschnitt zu bezeichnen. 14:30,5 , 1430,5 , 14:30.5 oder 1430.5 repräsentieren alle 14 Stunden, 30 Sekunden und eine Hälfte.
  • Schließlich ist der Zeitzonenabschnitt optional. Wenn vorhanden, kann es entweder der Buchstabe Z, ±hh:mm , ±hh oder ±hhmm sein.

Es gibt also viele mögliche Ausnahmen, die berücksichtigt werden müssen, wenn Sie nach der vollständigen Spezifikation analysieren wollen. In diesem Fall könnte der ursprüngliche Code wie folgt aussehen:

%Vor%

Und dann müssten Sie parseDate , parseTime und parseOffset erstellen. Der spätere sollte die Zeitversätze von UTC zurückgeben, während die ersten beiden Dinge wie komprimierte Formate, Zeitanteile, Komma oder Punkttrennzeichen und dergleichen berücksichtigen müssen.

parseDate wird wahrscheinlich das Zeichen "^" am Anfang seiner Musterübereinstimmungen verwenden, da das Datum am Anfang der Zeichenfolge stehen muss. Die Muster von parseTime beginnen wahrscheinlich mit "T" . Und parseOffset endet mit "$" , da die Zeitversätze, wenn sie existieren, am Ende stehen.

Eine Funktion "full ISO" parseOffset könnte ähnlich aussehen:

%Vor%

Übrigens nehme ich an, dass Ihr Computer in UTC-Zeit arbeitet. Wenn dies nicht der Fall ist, müssen Sie einen zusätzlichen Offset für Ihre Stunden / Minuten berücksichtigen, um dies zu berücksichtigen.

%Vor%

Um Ihren lokalen Offset zu erhalten, sollten Sie sich Ссылка ansehen.

Ich hoffe, das hilft. Grüße!

    
kikito 27.10.2011, 08:20
quelle
1

Es gibt auch das Paket luadate , das iso8601 unterstützt. (Sie möchten wahrscheinlich die gepatchte Version )

    
Brian M. Hunt 27.03.2015 18:59
quelle

Tags und Links