Setzt den OpenSpec-Change phase-3-ortszeit um (21/21 Aufgaben) und zieht
damit die in Phase 3 eingegangene Abweichung zurueck: DATE$, TIME$, TIMER
und NOW rechnen in der Zeitzone des Rechners, TIMER zaehlt ab der lokalen
Mitternacht.
Versatzermittlung
- jiff 0.2.35 als Abhaengigkeit von tb-runtime
- datetime::utc_versatz(zeitpunkt) ist der einzige Aufrufpunkt der
Bibliothek; die Kalenderrechnung darunter bleibt Eigenimplementierung
und sieht sie nie -- zwei Kalendermodelle nebeneinander waeren eine
dauerhafte Fehlerquelle
- Der Versatz gilt je Zeitpunkt, nicht je Programmlauf: ein Programm, das
ueber eine Zeitumstellung hinweg laeuft, folgt ihr
Zonenzustand
- Zeitzone { System, Fest(i32), Unbekannt } im RtState
- Fest(n) macht Tests und Korpusprogramme unabhaengig von der Zone des
Testrechners; TZ waere prozessweit und set_var seit Rust 2024 unsafe
Rueckfallebene
- Ohne ermittelbare Zone gilt UTC, das Programm laeuft weiter
- tbc run meldet den Rueckfall einmal beim Start auf der Fehlerausgabe,
nicht je Abfrage -- ein stiller Wechsel waere ein Verstoss gegen den
Guiding Principle
Korpus
- Neue Direktive ' tb-tz: +-HH:MM im Harness
- zeitzone.bas prueft Ortszeit, TIMER ab lokaler Mitternacht und den
Programmversatz gegen eine gesetzte Uhrzeit
- datumzeit.bas auf die Direktive umgestellt; Sollausgabe unveraendert
Nebenbefund
- TIMER trennt jetzt ganze Sekunden (Ortszeit) vom Bruchteil
(Systemuhr). Ohne die Trennung waere TIMER in Zonen mit halbstuendigem
Versatz gesprungen.
Dokumentation: die Abweichung "Uhr laeuft in UTC" entfaellt aus
sprachreferenz.md; bibliothek.md und PLAN.md nachgezogen, jiff steht im
Stufe-2-Ideenspeicher neben crossterm.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
4.1 KiB
4.1 KiB
1. Versatzermittlung
- 1.1
jiffals Workspace-Abhängigkeit aufnehmen und intb-runtimeeinbinden; verifiziert dadurch, dasscargo build -p tb-runtimedurchläuft undcargo tree -p tb-runtimedie Bibliothek genau einmal zeigt - 1.2
datetime::utc_versatz(zeitpunkt: i64) -> Option<i32>als einzigen Aufrufpunkt der Bibliothek schreiben (Sekunden Versatz,None= Zone nicht ermittelbar); verifiziert durch Unit-Test, dass der Versatz für einen festen Zeitpunkt im gültigen Bereich −50400…50400 liegt - 1.3 Sommerzeit prüfen: für dieselbe Zone einen Zeitpunkt im Januar und einen im Juli abfragen; verifiziert durch Unit-Test, dass sich die Versätze in einer Zone mit Sommerzeit unterscheiden und in einer ohne gleich bleiben
- 1.4 Sicherstellen, dass die Kalenderrechnung unberührt bleibt; verifiziert dadurch, dass
datetime.rsaußerhalb vonutc_versatzkeinen Bibliotheksaufruf enthält und die bestehendendatetime-Tests unverändert grün sind
2. Zonenzustand in der Laufzeit
- 2.1
Zeitzone { System, Fest(i32), Unbekannt }einführen und inRtStatehalten; VorgabeSystem, bei fehlgeschlagener ErmittlungUnbekannt; verifiziert durch Unit-Test je Variante - 2.2
jetzt_sekunden/jetzt_serialauf den Zonenzustand umstellen; verifiziert durch Unit-Test, dassFest(3600)genau eine Stunde gegenüberUnbekanntverschiebt - 2.3
DATE$,TIME$,TIMERundNOWüber den Zonenzustand rechnen; verifiziert durch Test, dassHOUR(NOW)und die Stunde ausTIME$beiFest(n)übereinstimmen - 2.4
TIMERzählt ab lokaler Mitternacht; verifiziert durch Test, dass sichTIMERbeiFest(3600)gegenüberUnbekanntum 3600 verschiebt (modulo Tageslänge) - 2.5
DATE$ =/TIME$ =wirken auf die Ortszeit; verifiziert durch Test, dassTIME$nachTIME$ = "10:20:30"genau diesen Wert nennt undHOUR(NOW)10 liefert
3. Rückfallebene
- 3.1 Bei nicht ermittelbarer Zone auf UTC zurückfallen, ohne Fehler; verifiziert durch Test mit
Zeitzone::Unbekannt, dass alle Zeitfunktionen Werte liefern - 3.2 Den Rückfall beim Programmstart einmalig auf die Fehlerausgabe melden (nicht je Abfrage); verifiziert dadurch, dass
tbc runbeiUnbekanntgenau eine Meldung schreibt und die Standardausgabe unberührt bleibt - 3.3 Rückfallebene in docs/sprachreferenz.md beschreiben; verifiziert durch den Abschnittseintrag
4. Prüfbarkeit ohne Abhängigkeit von der Testmaschine
- 4.1 Kopfzeilen-Direktive
' tb-tz: ±HH:MMim Korpus-Harness auswerten und alsZeitzone::Festsetzen; verifiziert dadurch, dass ein Korpusprogramm ohne die Direktive weiterhin läuft und eines mit ihr den gesetzten Versatz verwendet - 4.2 Korpusprogramm
zeitzone.basmit festem Versatz:DATE$/TIME$/TIMER/NOWgegen eine perDATE$ =/TIME$ =gesetzte Uhrzeit prüfen; verifiziert dadurch, dass die Sollausgabe unabhängig von der Zone des Testrechners stimmt - 4.3 Bestehendes
datumzeit.basauf die Direktive umstellen, damit es auch nach der Umstellung deterministisch bleibt; verifiziert dadurch, dass seine Sollausgabe unverändert bleibt
5. Abschluss
- 5.1 Abweichung „Uhr läuft in UTC" aus docs/sprachreferenz.md entfernen und durch die Beschreibung der Zonenermittlung ersetzen; verifiziert dadurch, dass der Abweichungspunkt nicht mehr auftaucht
- 5.2
docs/bibliothek.md, Abschnitt Datum/Zeit, fortschreiben; verifiziert durch den geänderten Abschnitt - 5.3 PLAN.md Stufe 2, Eintrag „Runtime-Bibliotheken als BASIC-Bibliotheken", um die Zeitzonenbibliothek erweitern (Zonennamen, Versatz zu einem Zeitpunkt, Umrechnung zwischen Zonen) — neben crossterm; verifiziert durch den ergänzten Eintrag
- 5.4 PLAN.md Phase 3: den Hinweis auf die UTC-Abweichung durch den Verweis auf diesen Change ersetzen; verifiziert durch den aktualisierten Abschnitt
- 5.5 Inventar unverändert lassen und den Abgleichstest prüfen; verifiziert dadurch, dass
cargo test -p tb-frontend --test inventargrün bleibt (die Elemente waren bereits implementiert, nur ihr Zeitbezug ändert sich) - 5.6 Vollständige Suite ausführen; verifiziert dadurch, dass
cargo test --workspacegrün ist