Chrono Mock
LinguaItaliano

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 TZ funziona per alcuni runtime e non per altri. Un'applicazione Windows nativa che legga GetTimeZoneInformation non 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.Local di .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:30 per 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 →

Provalo