Wikiup:Lua/Werkstatt/Datum und Uhrzeit

aus Wikipedia, der freien Enzyklopädie

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

Konzeption

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

Eingabe

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

Neutrales Datenformat

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

Menschenfreundlicher Bezeichner für Ausgabeformat.

Bezeichner Beispiel #time Bemerkung
T. Monat JJJJ hh:mm:ss Z
nil, false
8.&nbsp;Januar 2025 01:56:30 (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 2025-01-08T01:56:30+00:00 c
timestamp 20191024104829 {{REVISIONTIMESTAMP}}
usw. usw. usw.

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

Funktionen

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

Parsen

  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

  • 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

enWP

en:Module:Age
metatable; ausschlachten
en:Module:Duration
Sehr mager, aber können wir auch.
en:Module:Jewishholidays
Schaffen wir auch noch.

Diskussion

  1. Die Millisekunden tauchen nur zusammen mit Sekunden auf. Ich halte es für unnötig, sie in einem separaten Parameter / Table-Element zu führen. Da Lua sowieso keinen Unterschied zw. Integer und Gleitkomma macht, können die Millisekunden einfach als Dezimalstellen der Sekunden geführt werden.
  2. Benötigte Features
    1. Das julianische Datum - nicht zu verwechseln mit Julianischer Kalender - gehört hier auch hinein. Ebenso auch das modifizierte julianische Datum.
    2. Subtraktion von zwei Zeitpunkten (Zeitspanne berechnen), Addition und Subtraktion einer Zeitdifferenz zu bzw. von einem Zeitpunkt. Das (modifizierte) julianische Datum eignet sich sehr gut dafür.
  3. Bitte keine kryptischen Funktionsnamen. "story", "spec" u.Ä. ist ohne Aussagekraft und es ist auch nicht verboten, deutsche Namen zu nehmen. Letzteres ist für externe Funktionen sogar vorzuziehen.
  4. Das "Programmier-Steno" der Abschnitte 1 bis 4 sollte decodiert werden.
ÅñŧóñŜûŝî (Ð) 23:53, 25. Jun. 2013 (CEST)
  • @Millisekunden:
    • Es ist sehr viel einfacher, die Existenz eines separaten Feldes abzufragen, als durch Rumrechnerei mit floor und round und minus hinterher herauszufinden, ob es Nachkommastellen gibt, und welches Ausgabeformat in dieser Situation angemessen wäre. Aus dem Zusammenrühren in einer Gleitkommazahl lässt sich hinterher nicht mehr ermitteln, ob es mit .000 angegeben war. Der Unterschied zwischen 0 und nil ist hingegen leicht festzustellen.
    • Eine Aufgabenstellung kann schließlich lauten: Stelle das Ergebnis einer Berechnung im gleichen Format dar, das für den ersten Operanden benutzt wurde.
  • Das Julianische Datum ist eine reine Tageszählung und passt hier nur bedingt in das jahrweise gezählte Datum; aber eine Konvertierungsfunktion in ein Datum nach Jahren usw. ist machbar.
  • Ich schreibe für die weltweite WikiCommunity und nicht für die deWP.
    • Vorlagenprogrammierer bekommen mindestens den Namen des ersten Parameters nie zu sehen, da er unbenannt ist, und der einzige zweite voraussichtlich auch.
VG --PerfektesChaos 11:48, 13. Jul. 2013 (CEST)
Da du sowieso alles bestimmen willst, ist es wohl besser, du machst auch alles allein. Ein Komandostil, wie er hier zutage tritt, wird Ünterstützer weitgehend fern halten. Fragt sich nur, wann du mit der ganzen Arbeit fertig bist. Schade, dass du nicht ausreichend kooperationsfähig bist, um auf eine Weise ein Team zu bilden, bei dem die übrigen Teilnehmer ihr Gesicht wahren können. Dieses Modul musst du - genauso wie die meisten anderen - wohl alleine erstellen. ÅñŧóñŜûŝî (Ð) 22:05, 15. Aug. 2013 (CEST)
@ ÅñŧóñŜûŝî. Lang, lang ist's her! Aber seit 12 Jahren und 24 Tagen ist Deine Bemerkung immer noch zutreffend! --Klaus-Peter 12:48, 24. Okt. 2019 (CEST)