Wikipedia:Lua/Werkstatt/Datum und Uhrzeit

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Aufgabe: Entwicklung eines Bibliotheksmoduls zur Unterstützung deutsch- und englischsprachiger Formate für Datum und/oder Uhrzeit.

Alle Funktionen von anderem Lua-Modul aus nutzbar; soweit dazu geeignet, auch von Vorlage=#invoke aufrufbar.

  • Alle zweifelsfreien Datumsformate für den deutsch- und englischsprachigen Raum sind bei der Eingabe zu unterstützen: 15. Februar 2013; 15.2.2013; 15.02.13; 14.8.98; 2013-06-12; 3. Jänner 2012; 5 Mar 2011; December 9, 2010; 1. Apr. 2012.
  • Die Ausgabe soll in einigen wesentlichen deutschsprachigen Standardformen + ISO + Wiki-Standards erfolgen.
  • Mit Uhrzeit ähnlich, aber weniger Varianten möglich.
  • Fehlerbehandlung für Wartungskats ist zu unterstützen.

Daten[Quelltext bearbeiten]

Eingabe[Quelltext bearbeiten]

Siehe Diskussion

Abfangen aller   und U+00A0 und mehrfacher oder fehlender Leerzeichen bei der Eingabe. Interpretieren jedes eindeutigen Formats.

Neutrales Datenformat[Quelltext bearbeiten]

Siehe Diskussion

Die Eingabe wird, sofern zweifelsfrei interpretiert, in eine table gewandelt. Diese kann auch direkt von anderen Lua-Modulen belegt oder für Vergleichsoperationen und Berechnungen herangezogen werden. Alle Zahlen sind ganzzahlig, wodurch sich Genauigkeiten und erforderliche Ausgabefomate schnell und sicher bestimmen lassen.

Alle Daten-Komponenten sind optional. Nicht belegte waren bei der Eingabe nicht angegeben worden.

Komponente Typ Bemerkung
year number >0 (=0??)
month number 1–12; auch ohne year
dom number Nur, wenn auch month
week number Nach ISO berechnet
hour number
min number Nur, wenn auch hour
sec number Nur, wenn auch min
msec number Nur, wenn auch sec
zone string, number, boolean Code (CET,CEST,MEZ) oder Anzahl der Minuten
false, nil: Lokal, einschließlich Sommerzeit
jul boolean false, nil: Gregorianischer Kalender
bc boolean false, nil: n. Chr.
leap boolean false, nil: min<60
isValid() function Die momentane Tabelle ist gültig.
format(spec) function Formatiere gemäß spec

spec[Quelltext bearbeiten]

Menschenfreundlicher Bezeichner für Ausgabeformat.

Bezeichner Beispiel #time Bemerkung
T. Monat JJJJ hh:mm:ss Z
nil, false
3.&nbsp;Mai 2024 04:25:25 (CEST) j."&nbsp;"F Y H:i:s und Zeitzone Sekunden, Minuten, Stunde nur wenn angegeben gewesen.
dewiki 22:14, 12.&nbsp;Juni 2013 (CEST) Uhrzeit nur wenn angegeben gewesen.
T. Monat JJJJ 12.&nbsp;Juni 2013 angegebene Uhrzeit unterdrücken
T. Mon JJJJ 12.&nbsp;Jun. 2013
T.Mon JJJJ 12. Jun. 2013
TT.MM.JJJJ 12.06.2013
T.M.JJJJ 12.6.2013
ISO 2013-06-12 22:14:37+02:00
ISO-T 2024-05-03T04:25:25+02:00 c
timestamp 20221030071027 {{REVISIONTIMESTAMP}}
usw. usw. usw.

mw.language:formatDate() kennt alle Formatierungsdetails gemäß Parser Funktion #time.

Funktionen[Quelltext bearbeiten]

Alle Lua-zugänglich. Jede story und spec ignoriert Whitespace drumrum.

  • story ist die Zeichenkette mit zu interpretierender Eingabe.
factory( story, lethal )
Generiere table=Objekt
Nur Lua-intern; insbesondere Eigenbedarf
  • story
    • string: Parser
    • false/nil: liefert leeres Objekt, →table
    • table: wird um Methoden ergänzt und belegt jede freie number=0.
  • lethal
    • true: throws error, if anything invalid
Liefert neutrale table, oder string mit Fehlermeldung
format( story, spec )
auch für Vorlagen
Rufe factory() auf und mit deren Ergebnis .format(spec)
isValid( story, light, lethal )
zweifelsfrei interpretierbar
auch für Vorlagen
light: erlaube leeren Wert
Rufe factory() auf; true wenn diese eine table liefert und diese .isValid()
isPretty( story, spec, light )
interpretierbar, und abgesehen von &nbsp; identisch mit spec-Resultat formatiert gewesen
auch für Vorlagen
light: erlaube leeren Wert
Rufe format() auf; true wenn dies identisch story liefert
timezone( shift, local )
Kennung für Zeitzone
  • shift: string, number, nil, false
    • nil, false: Server-Bezugszeit
  • local:
    • nil: +02:00
    • false: CET/CEST
    • true: MEZ/MESZ
Ausgabeformate; standard: +nn:mm
  1. nbsp usw. → Leerzeichen
  2. Hinten Zeitzone?
    • Klammern weg, Ablegen in Feld, Entfernen aus dem string
  3. Erste vier Zeichen alles Ziffern?
    • Wenn ja, dann Jahr allein oder ISO oder timestamp
    • Wenn nicht: Buchstaben vorhanden?
      • Keine Buchstaben: Am Anfang Gruppe aus drei Zahlen, durch Nicht-Ziffern getrennt.
      • Buchstaben:
        1. Am Anfang Buchstabengruppe, danach zwei Zahlengruppen
        2. Zahlengruppe-Buchstabengruppe-Zahlengruppe
        • Buchstabengruppe (Großschreibung des ersten Buchstaben in Kleinschreibung wandeln) in Liste der de/en-Monatsnamen und derer ersten drei Buchstaben suchen. Zugeordnete Nummer 1–12 auslesen.
      • Dritte Zahlengruppe ist Jahreszahl
        • Zweistellige Jahreszahl 00–20 und 50–99 akzeptieren, ggf. warnen (Millenium bug)

Zweite Ausbaustufe[Quelltext bearbeiten]

  • Servicefunktionen für Vorlage:JULGREGDATUM + Vorlage:GREGDATUM
  • Zeitdifferenz zwischen neutralen Objekten; Addition, Subtraktion, Vergleich (als Methoden)
  • Gültigkeitsregeln:
    • Generell: 30. Februar usw. werden als feherhaft erkannt
    • Vorgegebene Kriterien, etwa:
      • Nicht vor dem …
      • Nicht nach dem …
      • Nicht in der Zukunft
en:Module:Age
metatable; ausschlachten
en:Module:Duration
Sehr mager, aber können wir auch.
en:Module:Jewishholidays
Schaffen wir auch noch.