Wikiup:Lua/Werkstatt/Datum und Uhrzeit
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. Januar 2025 01:56:30 (CEST) | j." "F Y H:i:s und Zeitzone
|
Sekunden, Minuten, Stunde nur wenn angegeben gewesen. |
dewiki
|
22:14, 12. Juni 2013 (CEST) |
|
Uhrzeit nur wenn angegeben gewesen. |
T. Monat JJJJ
|
12. Juni 2013 |
|
angegebene Uhrzeit unterdrücken |
T. Mon JJJJ
|
12. 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
- story
- 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 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
- shift: string, number, nil, false
- Ausgabeformate; standard: +nn:mm
Parsen
- nbsp usw. → Leerzeichen
- Hinten Zeitzone?
- Klammern weg, Ablegen in Feld, Entfernen aus dem string
- 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:
- Am Anfang Buchstabengruppe, danach zwei Zahlengruppen
- 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
- 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.
- Benötigte Features
- Das julianische Datum - nicht zu verwechseln mit Julianischer Kalender - gehört hier auch hinein. Ebenso auch das modifizierte julianische Datum.
- 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.
- 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.
- Das "Programmier-Steno" der Abschnitte 1 bis 4 sollte decodiert werden.
- @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 zwischen0
undnil
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.
- 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
- 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.
- @Millisekunden:
- 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)
- 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)