Fusos horários em apps de agendamento: regras para evitar usuários irritados
Fusos horários em apps de agendamento são uma das principais causas de reuniões perdidas. Saiba modelos de dados mais seguros, regras para eventos recorrentes, armadilhas do horário de verão e textos amigáveis para usuários.

Por que fusos horários fazem apps de agendamento parecerem pouco confiáveis
Fusos horários transformam pequenos erros de conta em promessas quebradas. Uma reunião que muda 1 hora não é "próxima o suficiente". Ela muda quem aparece, quem parece despreparado e quem perde algo importante. Depois que isso acontece duas vezes, as pessoas deixam de confiar no calendário e começam a checar tudo no chat.
O problema central é que o tempo parece absoluto para humanos, mas não é absoluto no software. Pessoas pensam em horário local ("09:00 da manhã no meu horário"). Computadores costumam pensar em offsets ("UTC+2") que podem mudar ao longo do ano. Quando seu app mistura essas ideias, ele pode mostrar a hora certa hoje e a hora errada no mês seguinte.
Os sintomas também parecem aleatórios, o que os torna piores. Usuários relatam coisas como reuniões "se movendo" mesmo sem edições, lembretes disparando cedo ou tarde, séries em que apenas algumas instâncias mudam 1 hora, convites mostrando horários diferentes em dispositivos distintos ou eventos duplicados aparecendo após viagens.
Os mais prejudicados são os que mais dependem de agendamento: equipes remotas em vários países, clientes que reservam entre fronteiras e qualquer pessoa que viaje. Um gerente de produto voando de Nova York para Londres pode esperar que uma reunião às 14:00 se mantenha ancorada ao fuso do organizador, enquanto o viajante espera que ela acompanhe seu horário local atual. Ambas expectativas são razoáveis. Só uma pode ser verdadeira, então você precisa de regras claras.
Não é só sobre qual hora você mostra no cartão do evento. Regras de fuso horário tocam toda a superfície de agendamento: eventos únicos, recorrentes, lembretes, e-mails de convite e qualquer coisa que dispare num momento específico. Se você não definir a regra para cada um desses, seu modelo de dados a definirá silenciosamente, e os usuários descobrirão a regra do jeito difícil.
Um exemplo simples: um standup semanal "Segunda às 09:00" é criado em março. Em abril, o horário de verão muda para a região de um participante. Se seu app armazenou como "a cada 7 dias no mesmo instante UTC", esse participante de repente o vê às 10:00. Se seu app armazenou como "toda segunda às 09:00 no fuso horário do organizador", ele fica às 09:00 e o instante UTC muda. Qualquer escolha pode funcionar, mas o app deve ser consistente e honesto sobre isso.
Termos-chave: UTC, horário local, offsets e DST
A maioria dos bugs de fuso horário vem de confundir algumas ideias básicas. Usar as palavras certas também deixa a cópia da UI mais clara.
UTC e "tempo absoluto"
UTC (Tempo Universal Coordenado) é o relógio de referência global. Pense nele como a linha do tempo única que todos compartilham.
Um "tempo absoluto" é um momento específico nessa linha do tempo, como 2026-01-16 15:00:00 UTC. Se duas pessoas em países diferentes olharem para esse momento, elas devem ver o mesmo instante, apenas exibido com relógios locais diferentes.
Horário local, offsets e IDs de fuso
Horário local é o que a pessoa vê no relógio da parede, como "09:00". Por si só, isso não é suficiente para identificar um instante. Você precisa de uma regra de localização.
Um offset é a diferença em relação ao UTC num dado momento, como UTC+2 ou UTC-5. Offsets mudam ao longo do ano em muitos lugares, então armazenar apenas "UTC+2" é arriscado.
Um ID de fuso é a regra real, geralmente um nome IANA como America/New_York ou Europe/Berlin. IDs capturam o histórico e mudanças futuras daquela zona, incluindo o DST.
Diferença prática:
- Offset: "UTC-5" (sem garantia que permaneça assim)
- ID de fuso:
America/New_York(sabe quando vira UTC-4)
DST (horário de verão)
DST é quando uma região adianta ou atrasa os relógios, normalmente em 1 hora. Isso significa que o offset em relação ao UTC muda.
Duas surpresas do DST:
- "Spring forward" cria uma hora inexistente. Alguns horários locais simplesmente não existem.
- "Fall back" repete uma hora. O mesmo horário local acontece duas vezes.
Tempo absoluto vs horário do relógio
Horário do relógio é o que os usuários digitam: "Todas as segundas às 09:00". Tempo absoluto é o que seu sistema precisa executar: "envie o lembrete neste instante exato em UTC". Eventos recorrentes normalmente começam como regras de relógio e depois viram uma série de instantes absolutos.
Usuários acham que agendaram "09:00 no meu fuso". Seu banco de dados pode armazenar 2026-03-10 13:00 UTC. Ambos podem estar corretos, mas só se você também lembrar qual regra de fuso foi pretendida.
Dispositivos também mudam de fuso. Pessoas viajam, e laptops podem trocar de zona automaticamente. Se seu app reinterpretar silenciosamente um "09:00" salvo usando a nova zona do dispositivo, os usuários vão sentir que o horário "se moveu" mesmo sem terem feito nada.
Escolhas de modelo de dados que evitam mudanças silenciosas
A maioria dos bugs "minha reunião mudou" é bug de modelo de dados. O padrão mais seguro para eventos únicos é: armazene um único instante em UTC e converta para o horário local do usuário apenas na exibição.
Um evento único é algo como "12 out 2026 às 15:00 em Berlin." Esse momento acontece uma vez. Se você armazená-lo como UTC (um instante na linha do tempo), ele sempre mapeará de volta ao mesmo momento, não importa onde o visualizador esteja.
Armazenar apenas um horário local (como "15:00") quebra assim que alguém visualizar de outro fuso, ou o criador mudar as configurações do dispositivo. Armazenar apenas um offset (como "+02:00") quebra depois porque offsets mudam com DST. "+02:00" não é um lugar, é uma regra temporária.
Quando armazenar um ID de fuso junto com UTC? Sempre que você se importa com o que o criador quis dizer, não só com o instante salvo. Um ID como Europe/Berlin ajuda na exibição, auditoria e suporte, e torna-se essencial para eventos recorrentes. Permite dizer: "Este evento foi criado como 15:00 horário de Berlin," mesmo que o offset de Berlin mude no mês seguinte.
Um registro prático para um evento único geralmente inclui:
start_at_utc(eend_at_utc)created_at_utccreator_time_zone_id(nome IANA)original_input(o texto ou campos que o usuário digitou)input_offset_minutes(opcional, para depuração)
Para suporte, esses campos transformam uma reclamação vaga em uma reprodução clara: o que o usuário digitou, qual zona o dispositivo alegou e qual instante seu sistema armazenou.
Seja rígido sobre onde a conversão acontece. Trate o servidor como a fonte da verdade para armazenamento (apenas UTC) e o cliente como a fonte de intenção (horário local mais um ID de fuso). Converta horário local para UTC uma vez, no momento da criação ou edição, e não "re-converta" o UTC salvo em leituras posteriores. Mudanças silenciosas frequentemente ocorrem quando cliente e servidor aplicam conversões, ou quando um dos lados adivinha o fuso em vez de usar o informado.
Se aceitar eventos de múltiplos clientes, registre o ID de fuso e valide-o. Se estiver faltando, peça que o usuário escolha em vez de adivinhar. Esse pequeno prompt evita muitos tickets irritados depois.
Passo a passo: do input do usuário ao evento armazenado e à exibição
Quando usuários continuam vendo horários "moverem", geralmente é porque diferentes partes do sistema convertem de modos diferentes.
Escolha um lugar para ser a fonte da verdade das conversões. Muitas equipes escolhem o servidor porque garante o mesmo resultado para web, mobile, e-mails e jobs em background. O cliente ainda pode pré-visualizar, mas o servidor deve confirmar os valores finais armazenados.
Um fluxo seguro que você pode seguir
Um pipeline repetível evita a maioria das surpresas:
- Entrada do usuário: capture o horário do relógio que ele digitou (por exemplo,
2026-03-10 09:00) e o fuso do evento como nome IANA (America/New_York), não uma abreviação como "EST". - Normalizar: valide que o horário local existe nessa zona (DST pode criar horários inexistentes), então converta para um instante.
- Armazenar: salve o instante em UTC mais o ID IANA da zona (e, se precisar depois, o horário local original escolhido).
- Renderizar: ao exibir, converta o instante UTC armazenado para a zona atual do visualizador e rotule claramente ("09:00 horário de New York").
- Notificar: agende lembretes a partir do instante UTC, mas formate a mensagem no fuso horário local do destinatário.
Exemplo: um anfitrião em Nova York cria "Ter 9:00 (America/New_York)." Um colega em Berlin vê como "15:00 (Europe/Berlin)" porque o mesmo instante UTC é exibido na zona deles.
Eventos de dia inteiro e campos apenas de data
Dia inteiro não é "00:00 UTC até 00:00 UTC." Geralmente é um intervalo de datas em um fuso específico. Armazene dia inteiro como valores apenas de data (start_date, end_date) mais a zona usada para interpretar essas datas. Caso contrário, um evento de dia inteiro pode aparecer começando no dia anterior para usuários a oeste do UTC.
Antes de liberar, teste o caso real: crie um evento, mude o fuso do dispositivo e reabra. O evento ainda deve representar o mesmo momento (para eventos com horário) ou a mesma data local (para dia inteiro), não mudar silenciosamente.
Eventos recorrentes: escolha a regra antes de escolher o esquema
A maioria dos bugs de agendamento aparece quando um evento se repete. O erro comum é tratar recorrência como "apenas copiar a data para frente." Primeiro decida a que o evento está ancorado:
- Ancorado a um instante: o evento se repete no mesmo momento no tempo (mesmo instante UTC), então o horário local pode mudar quando o DST muda.
- Ancorado ao relógio local: o evento se repete no mesmo horário local em um fuso específico, mesmo que o instante UTC mude.
Para a maioria dos calendários (reuniões, lembretes, horário de expediente), os usuários esperam o horário do relógio. "Toda segunda às 09:00" geralmente significa 09:00 na cidade escolhida, não "o mesmo instante UTC para sempre."
O que armazenar (para poder explicar depois)
Armazene recorrência como uma regra mais o contexto necessário para interpretá-la, não como uma lista pré-gerada de timestamps:
- Data e hora local de início (o que o usuário digitou)
- ID de fuso (IANA)
- Regra de recorrência (frequência, intervalo, dias)
- Exceções (saltos, edições de instâncias únicas)
- Condição opcional de fim (contagem ou até data, em termos locais)
Isso ajuda a lidar com DST sem "mudanças silenciosas" e torna edições previsíveis.
Gerando ocorrências sem deriva
Quando precisar de eventos para um intervalo de datas, gere em horário local na zona do evento e então converta cada instância para UTC para armazenamento ou comparação. A chave é adicionar "uma semana" ou "próxima segunda" em termos locais, não "+ 7 * 24 horas" em UTC.
Um teste mental simples: se o usuário escolheu 09:00 semanal em Berlin, cada instância gerada deve ser 09:00 horário de Berlin. O valor UTC vai mudar quando Berlin entrar em DST, e isso é correto.
Quando usuários viajam, seja explícito sobre o comportamento. Um evento ancorado em Berlin deve continuar ocorrendo às 09:00 horário de Berlin, e um viajante em Nova York verá a conversão para o horário local dele. Se você suportar eventos "flutuantes" que seguem o fuso atual do visualizador, rotule isso claramente. É útil, mas surpreende quando não é destacado.
Armadilhas de DST que causam os tickets mais raivosos
Problemas de DST parecem aleatórios para os usuários porque o app mostra um horário quando eles agendam e outro depois. A correção não é só técnica. Você precisa de regras claras e palavras claras.
Quando os relógios adiantam, alguns horários locais simplesmente não existem. Um exemplo clássico é 02:30 no dia de início do DST. Se deixar alguém escolher, você tem que decidir o que isso significa.
Quando os relógios atrasam, o oposto acontece: o mesmo horário local ocorre duas vezes. "01:30" pode ser a primeira ocorrência (antes da mudança) ou a segunda (depois). Se você não perguntar, estará chutando, e as pessoas notarão quando entrarem uma hora cedo ou tarde.
Regras práticas que evitam surpresas:
- Se um horário escolhido não existe (spring forward), bloqueie e explique por que, ou mova automaticamente para o próximo horário válido e mostre a mudança imediatamente.
- Se um horário é duplicado (fall back), pergunte "Qual 01:30?" e rotule as opções como "mais cedo" e "mais tarde" com o offset.
- Se uma reunião existente fica inválida por uma mudança de regra (atualizações de fuso), preserve a intenção original quando possível e notifique se precisar mudar.
- Para lembretes, agende com base no instante real do evento, não em "N minutos antes do horário do relógio."
- Nunca enquadre como erro do usuário. Explique como uma mudança de relógio naquela localização.
Um starter realista para um ticket de suporte: alguém agenda "02:30" em New York para o mês que vem, então o dia chega e o app mostra silenciosamente "03:30". Uma cópia melhor na criação é simples: "Esse horário não existe em 10 de mar devido à mudança do relógio. Escolha 01:30 ou 03:00." Se você ajustar automaticamente, diga: "Movemos para 03:00 porque 02:30 é pulado nesse dia."
Se você tratar DST como um detalhe de UI, ele vira problema de confiança. Se tratar como uma regra de produto, torna-se previsível.
Erros comuns e armadilhas a evitar
A maioria dos tickets raivosos vem de alguns erros repetidos. O app parece "mudar" um horário, mas o problema real é que as regras nunca foram tornadas explícitas em dados, código e texto.
Armadilhas de dados e armazenamento
Um erro comum é salvar apenas um offset (como -05:00) em vez de um verdadeiro fuso IANA (como America/New_York). Offsets mudam quando o DST começa ou termina, então um evento que parecia correto em março pode estar errado em novembro.
Abreviações de fuso são outra fonte frequente de bugs. "EST" pode significar coisas diferentes para sistemas distintos, e algumas plataformas mapeiam abreviações de forma inconsistente. Armazene um ID de fuso completo e trate abreviações apenas como texto de exibição, se chegar a mostrá-las.
Eventos de dia inteiro são uma categoria à parte. Se armazenar um evento de dia inteiro como "meia-noite UTC", usuários em offsets negativos frequentemente verão começar no dia anterior. Armazene dia inteiro como datas mais a zona usada para interpretar essas datas.
Uma checklist curta para revisão de código:
- Não armazene apenas tempos com offset e espere que o DST funcione.
- Não aceite "EST/PST/CET" como fuso confiável.
- Não armazene eventos de dia inteiro como instantes (
00:00 UTC). - Não agende lembretes no fuso do servidor em vez do fuso do evento.
- Não deixe web e mobile computarem conversões de forma diferente.
Entrega, lembretes e incompatibilidades entre plataformas
Lembretes e convites podem dar errado mesmo quando o armazenamento do evento está certo. Exemplo: um usuário cria "09:00 horário de Berlin" e espera um lembrete às 08:45 horário de Berlin. Se seu job scheduler roda em UTC e você inadvertidamente tratar "08:45" como horário local do servidor, lembretes vão disparar cedo ou tarde.
Diferenças entre plataformas pioram isso. Um cliente pode interpretar um horário ambíguo usando o fuso do dispositivo, outro usa o fuso do evento e um terceiro aplica uma regra de DST em cache. Se quiser comportamento consistente, mantenha conversões e expansão de recorrência num só lugar (geralmente o servidor) para que todo cliente veja o mesmo resultado.
Um teste simples de sanidade: crie um evento na semana em que o DST muda, veja-o em dois dispositivos com zonas diferentes e confirme que hora, data e lembrete batem com a regra que você prometeu aos usuários.
Verificações rápidas antes de liberar funcionalidades de agendamento
A maioria dos bugs de fuso horário não parece bug durante o desenvolvimento. Eles aparecem quando alguém viaja, quando o DST vira ou quando duas pessoas comparam screenshots.
Verificações de dados e armazenamento
Garanta que seu modelo de dados corresponda ao tipo de tempo com que você está lidando. Um evento único precisa de um único momento real no tempo. Um evento recorrente precisa de uma regra vinculada a um lugar.
- Para eventos únicos, armazene um instante exato (UTC) mais o contexto original voltado ao usuário se precisar mostrar "o que eles escolheram" depois.
- Para qualquer coisa recorrente ou voltada ao usuário, armazene o ID IANA do fuso (como
America/New_York), não apenas um offset. - Mantenha distinção clara entre tempos "flutuantes" (como "todo dia às 09:00" em uma zona específica) e instantes (como
2026-01-16T14:00Z).
Verificações de DST e casos limites
DST cria dois momentos perigosos: horários que não existem (spring forward) e horários que existem duas vezes (fall back). Seu app deve decidir o que fazer e fazê-lo de forma consistente.
- Quando um usuário escolhe um horário inexistente, bloqueie com mensagem clara ou altere automaticamente para o próximo horário válido (e diga).
- Quando um usuário escolhe um horário ambíguo (hora duplicada), faça-o escolher qual, ou adote uma regra (mais cedo vs mais tarde) e documente.
- Verifique eventos recorrentes através da fronteira do DST. Decida se "09:00 local" permanece às 09:00 ou se o instante UTC permanece fixo. Escolha uma e mantenha.
Cenário para testar: um sync semanal definido como "Segundas 09:00" em Berlin. Verifique o horário para alguém em Nova York antes e depois de a Europa mudar o DST, e novamente depois que os EUA mudarem (eles mudam em datas diferentes).
Verificações de UI e expectativas
Muitos tickets raivosos vêm de UI que oculta o fuso horário. As pessoas assumem o que querem que seja verdade.
- Mostre o fuso sempre que uma hora aparecer: detalhes do evento, telas de confirmação, e-mails, lembretes e exportações.
- Se você agendar para outra pessoa, mostre ambos os fusos: "09:00 Europe/Berlin (03:00 America/New_York)".
- Torne os controles de fuso óbvios e reflita a zona escolhida na cópia ("Este evento está agendado no horário de Europe/Berlin").
Verificações de testes
Não confie só no fuso do seu laptop e em um único formato local.
- Adicione testes para viagem: crie um evento em uma zona, depois veja em outra.
- Adicione testes que atravessem o início e o fim do DST, incluindo a hora inexistente e a hora duplicada.
- Teste múltiplos formatos de localidade (12h vs 24h, dia-mês vs mês-dia) para evitar relatos de "dia errado".
Um exemplo realista: uma reunião, dois países, uma mudança de DST
Um fundador baseado em Londres agenda um standup semanal com um colega em Nova York. Eles escolhem "Terças às 10:00" e supõem que isso sempre será de manhã para Londres e cedo para Nova York.
Uma configuração mais segura é tratar a reunião como "10:00 em Europe/London toda terça", calcular cada ocorrência no horário de Londres, armazenar o instante real (UTC) para essa ocorrência e exibi-lo no horário local de cada visualizador.
Ao redor da lacuna de spring DST, os EUA mudam os relógios mais cedo que o Reino Unido:
- Antes da mudança dos EUA: 10:00 em London (GMT) aparece como 05:00 em New York (EST).
- Depois da mudança dos EUA, mas antes do Reino Unido: 10:00 em London (ainda GMT) aparece como 06:00 em New York (EDT).
- Depois da mudança do Reino Unido: 10:00 em London (BST) aparece como 05:00 em New York (EDT) novamente.
Nada "se moveu" para o organizador. A reunião permaneceu às 10:00 em London. A única coisa que mudou foi o offset de New York por algumas semanas.
Lembretes devem seguir o que cada pessoa vê, não o que ela "vêia" antes. Se o colega de New York tem um lembrete de 15 minutos, ele deve disparar às 05:45 antes da mudança dos EUA, depois às 06:45 durante as semanas de diferença, sem ninguém editar o evento.
Agora adicione uma edição: depois de duas manhãs dolorosas, o organizador de Londres muda o standup para 10:30 horário de London a partir da próxima semana. Um bom sistema preserva a intenção aplicando a mudança no fuso do organizador, gerando novos instantes UTC para ocorrências futuras e deixando ocorrências passadas como estavam.
Uma boa cópia evita tickets: "Repete toda terça às 10:00 (horário de London). Convidados veem no horário local. Horários podem mudar 1 hora quando o horário de verão começa ou termina."
Próximos passos: cópia de UX mais clara e um plano de construção mais seguro
A maioria dos "bugs de fuso horário" relatados são, na verdade, bugs de expectativa. Seu modelo de dados pode estar correto, mas se sua cópia de UI for vaga, as pessoas assumem que o app vai ler a mente delas. Trate fusos horários como uma promessa de UX, não só um detalhe de backend.
Comece com cópia que nomeie o fuso sempre que um horário aparecer fora da UI principal, especialmente em notificações e e-mails. Não confie apenas em "10:00 AM". Coloque a zona ao lado e mantenha o formato consistente.
Padrões de texto que reduzem confusão:
- "Ter, 12 mar, 10:00 (America/New_York)"
- "Isso é 15:00 (Europe/London) para você"
- "Este evento está salvo em: horário de New York"
- "Se você viajar, esta reunião permanece no horário de New York"
- "Horários podem mudar 1 hora quando o horário de verão começa ou termina"
Dias de DST também precisam de mensagens amigáveis. Se um usuário escolhe um horário que não existe (como 02:30 na noite do avanço do relógio), evite termos técnicos e ofereça opções: "02:30 não está disponível em 10 de mar porque os relógios pulam. Escolha 01:30 ou 03:30." Se um horário ocorre duas vezes na noite de retrocesso, pergunte claramente: "Você quer a primeira 01:30 ou a segunda?"
Para construir com mais segurança, prototipe o fluxo completo (criar, convidar, ver em outro fuso, editar após DST) antes de polir telas:
- Escreva as regras em um parágrafo (o que fica fixo, o que converte).
- Rascunhe o modelo de dados (armazene UTC mais o fuso IANA original).
- Rascunhe textos de e-mail e notificação junto da UI.
- Teste três cenários: viagem, spring-forward, fall-back.
- Trave as decisões e então implemente.
Se você está construindo um recurso de agendamento rapidamente, uma plataforma de chat-para-app como Koder.ai pode ajudar a iterar nas regras, esquema e UI juntos. A velocidade é ótima, mas a mesma disciplina se aplica: armazene instantes em UTC, mantenha o fuso IANA do evento para intenção e sempre mostre aos usuários qual fuso eles estão vendo.
Perguntas frequentes
Devo armazenar eventos de calendário em UTC ou no horário local?
Armazene eventos únicos como instantes exatos em UTC e converta-os para o horário local de cada pessoa ao exibi-los. Guarde também o ID de fuso horário IANA do evento para preservar a intenção de quem o criou.
Por que um deslocamento UTC não é suficiente?
Use um ID de fuso horário IANA, como America/New_York ou Europe/Berlin. Um deslocamento como UTC-5 pode mudar quando começa ou termina o horário de verão, enquanto um ID de fuso inclui essas regras de horário.
Como reuniões recorrentes devem lidar com o horário de verão?
Para a maioria das reuniões, mantenha o evento no mesmo horário local do fuso escolhido pelo organizador. Gere cada ocorrência nesse fuso e depois converta cada uma para UTC. Assim, uma reunião semanal às 9:00 AM permanece às 9:00 AM após mudanças de horário de verão.
O que meu aplicativo deve fazer com um horário que não existe durante o horário de verão?
Bloqueie a seleção e explique claramente o motivo, ou mova-a para o próximo horário válido e mostre a alteração antes de salvar. Por exemplo, informe ao usuário que 2:30 AM não existe porque os relógios avançam.
O que acontece quando o mesmo horário local ocorre duas vezes?
Pergunte ao usuário se ele se refere à ocorrência anterior ou posterior e mostre o deslocamento de cada opção. O mesmo horário local pode ocorrer duas vezes quando os relógios atrasam, portanto adivinhar pode agendar a reunião com uma hora de diferença.
Uma reunião deve acompanhar alguém quando essa pessoa viaja?
A reunião deve permanecer vinculada ao fuso horário escolhido para o evento, a menos que você ofereça claramente uma opção de horário flutuante. Uma pessoa viajando vê o mesmo instante convertido para seu horário local atual, sem alterar a reunião para todos.
Como devo armazenar eventos de dia inteiro?
Armazene eventos de dia inteiro como datas de início e término, além do fuso que dá sentido a essas datas. Não os transforme em registros de data e hora à meia-noite em UTC, pois pessoas em outros fusos podem ver o evento no dia errado.
Onde devo mostrar o fuso horário do evento?
Mostre o fuso horário em todos os lugares onde os usuários precisam agir com base em um horário: detalhes do evento, confirmações, e-mails de convite, lembretes e exportações. Quando as pessoas agendam entre fusos, mostrar tanto o fuso do evento quanto o horário local de quem visualiza evita confusões.
O cliente ou o servidor deve converter o horário local para UTC?
Deixe o cliente enviar o horário local e o ID de fuso IANA, depois faça o servidor validá-los e convertê-los para UTC. O servidor deve gerar o valor final armazenado para que web, dispositivos móveis, e-mails e tarefas de lembrete sigam a mesma regra.
Quais casos de fuso horário devo testar antes do lançamento?
Teste viagens, a hora ausente no horário de verão, a hora repetida no horário de verão, eventos recorrentes durante o horário de verão, eventos de dia inteiro e visualizações em pelo menos dois fusos horários. Verifique também se lembretes e e-mails mostram a mesma regra de horário do calendário.