Chrono Mock
IdiomaPortuguês (Brasil)

Execute um app em outro fuso horário

O relatório que cai no dia errado, o lembrete que dispara uma hora antes, o carimbo de data e hora que se lê como amanhã - quase tudo isso só aparece em um fuso em que você não está. Isto dá a um processo o próprio deslocamento, enquanto o fuso do seu sistema fica exatamente onde estava.

Por que as respostas habituais não ajudam

  • Mudar o fuso horário do Windows o muda para tudo - seu calendário, seus logs, suas reuniões - e em uma máquina gerenciada pode não ser você quem decide mudá-lo.
  • Definir TZ funciona para alguns ambientes de execução e para outros não. Um aplicativo nativo do Windows que leia GetTimeZoneInformation não vai perceber de forma alguma.
  • As ferramentas de desenvolvedor do navegador sobrescrevem o fuso de uma página web, o que é excelente, e irrelevante para um aplicativo de desktop.

Um processo, um deslocamento

A sessão carrega o próprio deslocamento. O aplicativo pergunta ao Windows em que fuso está e recebe essa resposta, enquanto todos os outros programas da máquina recebem a real.

# O mesmo momento, visto da costa oeste dos Estados Unidos
chrono run "C:\apps\test.exe" --at 2027-01-15T09:00:00 --zone -08:00

# Só o fuso - a data real de hoje, o relógio de outra pessoa
chrono run "C:\apps\test.exe" --zone +09:00

A calculadora responde à outra metade da pergunta - o que um dado momento realmente marca em outro lugar. Converter preserva o instante e muda só o relógio de parede, que é exatamente como uma data cai no dia errado:

$ 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

Nove da manhã na Europa central é meia-noite na costa oeste dos Estados Unidos. O mesmo instante, e um relatório diário que agrupa por data local o coloca em um dia diferente conforme o lugar onde roda.

Limites honestos, e aqui eles importam

O fuso da sessão é um deslocamento fixo, sem horário de verão.

Uma sessão definida em +01:00 permanece em +01:00 quer o relógio marque janeiro ou julho. Uma execução que cruza uma transição real se desvia, portanto, uma hora do que aquele fuso realmente mostraria, e forçar um aplicativo a atravessar uma transição de horário de verão é algo que esta ferramenta ainda não faz. A calculadora de datas diz isso em vez de adivinhar.

  • O fuso se apresenta como “Chrono Session”, um nome que nenhum registro do Windows conhece. Tudo o que mapeia esse nome de volta para um fuso - inclusive o TimeZoneInfo.Local do .NET - recorre ao deslocamento, que é a resposta certa. Um aplicativo que insista em um nome de registro não vai encontrar nenhum.
  • O Java assume o fuso da sessão como um deslocamento. O fuso da sessão não tem horário de verão nem cidade por trás, então o Java o nomeia pelo deslocamento - GMT+05:30 para uma sessão em +05:30.
  • No modo Chromium e Electron, as páginas também leem o fuso da sessão. É o mesmo deslocamento fixo: cada página e cada worker é colocado nele e confere o que lê. O processo principal de um aplicativo Electron executa JavaScript no Node, que a sessão não alcança, então ele mantém o relógio real.
  • Os deslocamentos vão de -14:00 a +14:00 em minutos inteiros. Qualquer coisa fora disso é recusada em vez de ser dobrada em silêncio.

Qual desses casos se aplica ao seu aplicativo é algo que se mede, e não que se adivinha. A sessão relata a própria cobertura →

Experimente