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>
This commit is contained in:
@@ -94,6 +94,12 @@ fn cmd_run(args: &[String]) -> ExitCode {
|
||||
// Im Rohmodus ist Strg+C kein Signal mehr — der Abbruch kommt als
|
||||
// Ereignis und muss den Lauf beenden können.
|
||||
vm.set_poll_interrupt(true);
|
||||
// Der Rückfall auf UTC wird einmal beim Start gemeldet, nicht je
|
||||
// Zeitabfrage — ein stiller Wechsel wäre ein Verstoß gegen den
|
||||
// Guiding Principle.
|
||||
if vm.rt.zeitzone == tb_runtime::datetime::Zeitzone::Unbekannt {
|
||||
eprintln!("Zeitzone nicht ermittelbar — Zeitfunktionen rechnen in UTC.");
|
||||
}
|
||||
|
||||
// Ohne Terminal (Pipe, Skript, CI) läuft das Programm im PipeHost:
|
||||
// Eingabe zeilenweise von stdin, Ausgabe am Ende als Snapshot.
|
||||
|
||||
@@ -57,6 +57,28 @@ fn screen_groessen(name: &str, src: &str) -> Vec<(usize, usize)> {
|
||||
wert.split(',').map(|w| groesse_lesen(name, w)).collect()
|
||||
}
|
||||
|
||||
/// Optionale Zeitzone `' tb-tz: ±HH:MM`. Ohne Angabe gilt die Zone des
|
||||
/// Rechners — Zeitprogramme im Korpus setzen sie, damit ihre Sollausgabe
|
||||
/// unabhängig vom Standort des Testrechners bleibt.
|
||||
fn tz_direktive(name: &str, src: &str) -> Option<tb_runtime::datetime::Zeitzone> {
|
||||
let wert = direktive(src, "tb-tz:")?;
|
||||
let (vorzeichen, rest) = match wert.strip_prefix('-') {
|
||||
Some(r) => (-1i32, r),
|
||||
None => (1i32, wert.trim_start_matches('+')),
|
||||
};
|
||||
let (h, m) = rest
|
||||
.split_once(':')
|
||||
.unwrap_or_else(|| panic!("{name}: tb-tz erwartet ±HH:MM, fand {wert:?}"));
|
||||
let parse = |s: &str| {
|
||||
s.trim()
|
||||
.parse::<i32>()
|
||||
.unwrap_or_else(|_| panic!("{name}: {s:?} ist keine Zahl"))
|
||||
};
|
||||
Some(tb_runtime::datetime::Zeitzone::Fest(
|
||||
vorzeichen * (parse(h) * 3600 + parse(m) * 60),
|
||||
))
|
||||
}
|
||||
|
||||
/// Optionale Größenänderung mitten im Lauf:
|
||||
/// `' tb-resize: nach <n> auf <cols>x<rows>`.
|
||||
fn resize_direktive(name: &str, src: &str) -> Option<(usize, (usize, usize))> {
|
||||
@@ -112,6 +134,9 @@ fn run_corpus_file(path: &Path, groesse: Option<(usize, usize)>) -> String {
|
||||
.unwrap_or_else(|d| panic!("{}: Compile-Fehler: {d:?}", path.display()));
|
||||
let mut vm = Vm::new(module);
|
||||
vm.rt.screen.resize(cols, rows);
|
||||
if let Some(z) = tz_direktive(&name, &src) {
|
||||
vm.rt.zeitzone = z;
|
||||
}
|
||||
// `' tb-tempdir` — das Programm arbeitet mit Dateien.
|
||||
let _temp = direktive(&src, "tb-tempdir").map(|_| TempVerzeichnis::neu(&name));
|
||||
let mut host = CaptureHost::default();
|
||||
|
||||
Reference in New Issue
Block a user