Setzt den OpenSpec-Change phase-3-runtime-bildschirm um (77/77 Aufgaben). Abdeckung laut Inventar: 195 implementiert, 37 offen, 53 Non-Feature. Vollstaendigkeits-Inventar - docs/inventar.md mit 285 Eintraegen aus den Themenlisten von bas7advr.hlp und qb45advr.hlp, je mit Status und Fundstelle - crates/tb-frontend/tests/inventar.rs haelt die Tabelle in beide Richtungen gegen den Code; der Abdeckungsstand kann nicht veralten Bruchschritt (Puffer, Host, Korpus) - Cell/TextScreen ziehen ratatui-frei nach tb-runtime::screen; tb-ui behaelt Farbabbildung, Widget und den neuen Terminal-Host - Host wechselt vom Zeichenstrom auf Anzeige des Zellenpuffers plus Ereignisse (Taste, Groessenaenderung, Abbruch) - Korpusvergleich auf getrimmten Bildschirm-Snapshot; die acht bestehenden Sollausgaben blieben dabei unveraendert Groessenunabhaengigkeit - 80x25 ist nirgends mehr eine feste Grenze; Groessenaenderungen waehrend der Ausfuehrung werden zugestellt (Inhalt oben links erhalten, Cursor und VIEW PRINT geklemmt) - Korpusnachweis: dasselbe Programm bei 80x25 und 120x40 mit je eigener Sollausgabe, plus ein Programm mit Groessenwechsel mitten im Lauf Bibliothek - Breite Unicode-Zeichen belegen zwei Zellen (Cursor, POS, Randumbruch) - Bildschirm: CLS, COLOR, LOCATE, WIDTH, VIEW PRINT, SCREEN, CSRLIN, POS - Tastatur: INKEY$, INPUT$, Funktionstasten-Makros (KEY n / LIST / ON) - PRINT USING, LPRINT USING, FORMAT$, SetFormatCC - Mathematik mit kompatiblem PRNG (gleiche Saat, gleiche Folge) - Datum und Zeit mit Serienwerten ab 1899 - Finanzmathematik: FV#, PV#, Pmt#, IPmt#, PPmt#, NPer#, Rate#, NPV#, IRR#, MIRR#, SLN#, SYD#, DDB# - Datei-E/A: sequenziell, RANDOM (Recordpuffer und UDT-Variablen), BINARY, FIELD/LSET/RSET, Statusfunktionen, Dateisystem, MK$/CV - System: ENVIRON, FRE, CLEAR, TRON/TROFF, STACK, ERDEV, ERR-Anweisung Altlasten aus Phase 2 - ON ERROR GOTO auf Modulebene ist aus Prozeduren ansprechbar (prozeduruebergreifender Fixup im Codegenerator) - DATA behaelt seinen Rohtext (Gross-/Kleinschreibung, innerer Leerraum) - Die vier TODO-verify-Zellen der Konvertierungsmatrix sind aufgeloest Vom Inventar aufgedeckte Fehler - Zwoelf Non-Features wies der Compiler entgegen der Phase-1-Spec nicht ab (CALLS, SSEG, POINT, VIEW, COM, PEN, STRIG, STICK, die String*-Routinen, LINE und OPEN "COMn:") -- geschlossen - Drei Gruppen fehlten im urspruenglichen Umfang: Finanzmathematik, Record-Konvertierung, Rest der Dateisystemfunktionen - bas7advr.hlp allein ist keine vollstaendige Quelle; das Inventar bildet die Vereinigung mit qb45advr.hlp Neue Changes - phase-3-isam: schliesst Phase 3 ab (Speicherschicht redb) - phase-3-ortszeit: zieht die UTC-Abweichung zurueck Neue Abhaengigkeit: unicode-width. Dokumentiert: sprachreferenz.md und tbvm-design.md sind TODO-frei, docs/bibliothek.md neu, PLAN.md fortgeschrieben. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
77 lines
3.7 KiB
Markdown
77 lines
3.7 KiB
Markdown
# Ortszeit statt UTC
|
|
|
|
## Why
|
|
|
|
`DATE$`, `TIME$`, `TIMER` und `NOW` liefern heute koordinierte Weltzeit.
|
|
Das ist keine Rekonstruktion des Vorbilds, sondern eine Notlösung: die
|
|
Standardbibliothek von Rust kennt keine Zeitzonen, und in
|
|
`phase-3-runtime-bildschirm` sollte die erste schwere Abhängigkeit der
|
|
Laufzeit nicht nebenbei entstehen. Die Abweichung steht in
|
|
docs/sprachreferenz.md.
|
|
|
|
Für ein BASIC zum Bauen von Terminal-Werkzeugen ist das ein echter
|
|
Mangel: Ein Programm, das eine Uhr anzeigt, ein Protokoll schreibt oder
|
|
einen Termin prüft, zeigt schlicht die falsche Zeit — je nach Zone um
|
|
Stunden daneben. Das Vorbild lief auf der Ortszeit des Rechners; jedes
|
|
übernommene Programm rechnet damit.
|
|
|
|
Der Projektinhaber hat am 2026-09-04 entschieden, dafür eine Bibliothek
|
|
in die Laufzeit aufzunehmen. Dieser Change zieht die Abweichung zurück.
|
|
|
|
## What Changes
|
|
|
|
- **Zeitfunktionen liefern Ortszeit**: `DATE$`, `TIME$`, `TIMER` und
|
|
`NOW` rechnen in der Zeitzone des Rechners statt in UTC. `TIMER` zählt
|
|
Sekunden seit der **lokalen** Mitternacht.
|
|
- **Sommerzeit wird berücksichtigt**: Der Versatz wird für den jeweiligen
|
|
Zeitpunkt bestimmt, nicht einmalig beim Programmstart — ein Programm,
|
|
das über einen Zeitumstellungspunkt hinweg läuft, folgt ihm.
|
|
- **Neue Abhängigkeit in `tb-runtime`**: eine Zeitzonenbibliothek, deren
|
|
Berührungsfläche bewusst auf eine einzige Frage beschränkt bleibt —
|
|
„welcher UTC-Versatz gilt zu diesem Zeitpunkt?". Die Kalenderrechnung
|
|
(serielle Datumswerte, `WEEKDAY`, Zerlegung) bleibt die vorhandene,
|
|
getestete Eigenimplementierung in `tb-runtime::datetime`.
|
|
- **Rückfallebene**: Lässt sich die Zeitzone des Rechners nicht
|
|
ermitteln, gilt UTC. Das Programm läuft weiter; die Rückfallebene ist
|
|
über eine Funktion der Laufzeit erkennbar und dokumentiert.
|
|
- **`DATE$ =` / `TIME$ =` bleiben ein Programmversatz** (sie stellen
|
|
nicht die Systemuhr) — sie wirken künftig auf die Ortszeit.
|
|
- **Abweichung zurückziehen**: Der Eintrag „Uhr läuft in UTC" entfällt
|
|
aus docs/sprachreferenz.md; an seine Stelle tritt die Beschreibung der
|
|
Zonenermittlung samt Rückfallebene.
|
|
- **Stufe 2 im PLAN**: Die Zeitzonenbibliothek wird in den Ideenspeicher
|
|
„Runtime-Bibliotheken als BASIC-Bibliotheken" aufgenommen — neben
|
|
crossterm —, damit BASIC-Programme später direkt auf Zonen zugreifen
|
|
können (Zonennamen, Versatz zu einem Zeitpunkt, Umrechnung zwischen
|
|
Zonen).
|
|
|
|
**Non-Goals:** Zeitzonenbehaftete Datentypen im Dialekt (das Vorbild
|
|
kennt nur lokale Wanduhrzeit); eine Sprachanbindung an die Bibliothek
|
|
(das ist der Stufe-2-Eintrag, nicht dieser Change); Änderungen an der
|
|
Zählweise serieller Datumswerte oder an `DATEVALUE`/`TIMEVALUE`, die
|
|
Wanduhrzeit lesen und daher keine Umrechnung brauchen.
|
|
|
|
## Capabilities
|
|
|
|
### Modified Capabilities
|
|
|
|
- `konsolen-basisbibliothek`: Die Datums- und Zeitfunktionen SHALL die
|
|
Ortszeit des Rechners liefern statt UTC, einschließlich Sommerzeit und
|
|
einer dokumentierten Rückfallebene.
|
|
|
|
## Impact
|
|
|
|
- `crates/tb-runtime/src/datetime.rs`: Versatzermittlung über die neue
|
|
Bibliothek; `jetzt_serial`/`jetzt_sekunden` liefern Ortszeit. Die
|
|
Kalenderrechnung bleibt unverändert.
|
|
- `crates/tb-runtime/src/builtins.rs`: `DATE$`, `TIME$`, `TIMER`, `NOW`
|
|
rechnen über die neue Funktion.
|
|
- `Cargo.toml` (Workspace) und `crates/tb-runtime/Cargo.toml`: neue
|
|
Abhängigkeit.
|
|
- `tests/compat`: Korpusprogramm für die Zeitfunktionen, das ohne
|
|
Abhängigkeit von der Zone des Testrechners prüfbar bleibt.
|
|
- `docs/sprachreferenz.md`: Abweichung „Uhr läuft in UTC" entfällt;
|
|
Zonenermittlung und Rückfallebene beschrieben.
|
|
- `docs/bibliothek.md`: Abschnitt Datum/Zeit fortgeschrieben.
|
|
- `PLAN.md`: Stufe-2-Eintrag um die Bibliothek erweitert.
|