Esegui un'app in un altro fuso orario
Il report che finisce nel giorno sbagliato, il promemoria che scatta un'ora prima, il timestamp che si legge come domani - quasi tutto questo compare solo in un fuso in cui non ti trovi. Questo dà a un processo il proprio scostamento, mentre il fuso del tuo sistema resta esattamente dov'era.
Perché le risposte solite non aiutano
- Cambiare il fuso orario di Windows lo cambia per tutto - il calendario, i log, le riunioni - e su una macchina gestita potrebbe non spettare a te farlo.
- Impostare
TZfunziona per alcuni runtime e non per altri. Un'applicazione Windows nativa che leggaGetTimeZoneInformationnon se ne accorgerà affatto. - Gli strumenti per sviluppatori del browser sostituiscono il fuso per una pagina web, il che è ottimo, e irrilevante per un'applicazione desktop.
Un processo, uno scostamento
La sessione porta il proprio scostamento. L'applicazione chiede a Windows in quale fuso si trova e ottiene quella risposta, mentre ogni altro programma sulla macchina ottiene quella reale.
# Lo stesso momento, visto dalla costa occidentale americana chrono run "C:\apps\test.exe" --at 2027-01-15T09:00:00 --zone -08:00 # Solo il fuso - la data reale di oggi, l'orologio di qualcun altro chrono run "C:\apps\test.exe" --zone +09:00
Il calcolatore risponde all'altra metà della domanda - che cosa legge davvero un dato momento altrove. Convertire conserva l'istante e cambia solo l'orologio a muro, ed è esattamente così che una data finisce nel giorno sbagliato:
$ chrono calc --base 2027-01-15T09:00:00 --zone +01:00 --to-zone -08:00 Chrono Mock - date calculator base: 2027-01-15T09:00:00 step 1: zone -08:00 -> 2027-01-15T00:00:00 result: 2027-01-15T00:00:00 formats: ISO date 2027-01-15 ISO datetime 2027-01-15T00:00:00-08:00 US 01/15/2027 PL 15.01.2027
Le nove del mattino nell'Europa centrale sono mezzanotte sulla costa occidentale americana. Lo stesso istante, e un report giornaliero che raggruppa per data locale lo colloca in un giorno diverso a seconda di dove gira.
Limiti onesti, e qui contano
Il fuso della sessione è uno scostamento fisso senza ora legale.
Una sessione impostata su +01:00 resta a +01:00 sia che il suo orologio
indichi gennaio sia che indichi luglio. Un'esecuzione che attraversa una vera transizione si
discosta quindi di un'ora da ciò che quel fuso mostrerebbe davvero, e far attraversare a
un'applicazione un passaggio all'ora legale non è qualcosa che questo strumento fa ancora. Il
calcolatore di date lo dice invece di tirare a indovinare.
- Il fuso si presenta come «Chrono Session», un nome che nessun registro di
Windows conosce. Tutto ciò che riporta quel nome a un fuso - compreso
TimeZoneInfo.Localdi .NET - ripiega invece sullo scostamento, che è la risposta giusta. Un'applicazione che insista su un nome di registro non ne troverà uno. - Java recepisce il fuso della sessione come scostamento. Il fuso della sessione
non ha ora legale né una città dietro, quindi Java lo chiama con il suo scostamento -
GMT+05:30per una sessione a +05:30. - In modalità Chromium ed Electron anche le pagine leggono il fuso della sessione. È lo stesso scostamento fisso: ogni pagina e ogni worker viene portato su di esso e controlla ciò che legge. Il processo principale di un'applicazione Electron esegue JavaScript in Node, che la sessione non raggiunge, quindi mantiene l'orologio reale.
- Gli scostamenti vanno da -14:00 a +14:00 in minuti interi. Tutto ciò che sta fuori viene rifiutato invece di essere riavvolto in silenzio.
Quale di questi casi valga per la tua applicazione è qualcosa che si misura, non che si indovina. La sessione riporta la propria copertura →