Files
TerminalBasic/openspec/changes/phase-3-ortszeit/tasks.md
Chili Palmer a0fb41420e Ortszeit statt UTC
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>
2026-09-04 07:01:53 +02:00

4.1 KiB
Raw Blame History

1. Versatzermittlung

  • 1.1 jiff als Workspace-Abhängigkeit aufnehmen und in tb-runtime einbinden; verifiziert dadurch, dass cargo build -p tb-runtime durchläuft und cargo tree -p tb-runtime die 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.rs außerhalb von utc_versatz keinen Bibliotheksaufruf enthält und die bestehenden datetime-Tests unverändert grün sind

2. Zonenzustand in der Laufzeit

  • 2.1 Zeitzone { System, Fest(i32), Unbekannt } einführen und in RtState halten; Vorgabe System, bei fehlgeschlagener Ermittlung Unbekannt; verifiziert durch Unit-Test je Variante
  • 2.2 jetzt_sekunden/jetzt_serial auf den Zonenzustand umstellen; verifiziert durch Unit-Test, dass Fest(3600) genau eine Stunde gegenüber Unbekannt verschiebt
  • 2.3 DATE$, TIME$, TIMER und NOW über den Zonenzustand rechnen; verifiziert durch Test, dass HOUR(NOW) und die Stunde aus TIME$ bei Fest(n) übereinstimmen
  • 2.4 TIMER zählt ab lokaler Mitternacht; verifiziert durch Test, dass sich TIMER bei Fest(3600) gegenüber Unbekannt um 3600 verschiebt (modulo Tageslänge)
  • 2.5 DATE$ = / TIME$ = wirken auf die Ortszeit; verifiziert durch Test, dass TIME$ nach TIME$ = "10:20:30" genau diesen Wert nennt und HOUR(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 run bei Unbekannt genau 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:MM im Korpus-Harness auswerten und als Zeitzone::Fest setzen; verifiziert dadurch, dass ein Korpusprogramm ohne die Direktive weiterhin läuft und eines mit ihr den gesetzten Versatz verwendet
  • 4.2 Korpusprogramm zeitzone.bas mit festem Versatz: DATE$/TIME$/TIMER/NOW gegen eine per DATE$ =/TIME$ = gesetzte Uhrzeit prüfen; verifiziert dadurch, dass die Sollausgabe unabhängig von der Zone des Testrechners stimmt
  • 4.3 Bestehendes datumzeit.bas auf 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 inventar grün bleibt (die Elemente waren bereits implementiert, nur ihr Zeitbezug ändert sich)
  • 5.6 Vollständige Suite ausführen; verifiziert dadurch, dass cargo test --workspace grün ist