Pular para o conteúdo
GlobalTime

Documentação

Como usar o GlobalTime

Visão geral

O GlobalTime mostra a hora certa no seu fuso, sincronizada com o servidor, e reúne ferramentas de tempo: relógio mundial, conversor de fusos, relógio em tela cheia, cronômetro, temporizador, Pomodoro, despertador, contagem regressiva, calendário com eventos pessoais, feriados do Brasil, nascer e pôr do sol, calculadoras de datas e conversor de timestamp Unix.

Tudo funciona no navegador, de graça e sem anúncios. Criar uma conta é opcional e serve só para guardar os seus eventos do calendário no servidor (veja Eventos e conta).

Idioma e fuso horário

Idioma

Na primeira visita, o idioma acompanha a região do seu aparelho (a localidade informada por Intl) e, depois, as preferências do navegador (navigator.languages, ou navigator.language): vale o primeiro idioma que o GlobalTime oferece. Sem nenhum compatível, a interface abre em português do Brasil.

Idiomas disponíveis: português do Brasil, português europeu, inglês, espanhol, francês, alemão, italiano, holandês, russo, japonês, chinês simplificado, coreano e árabe (da direita para a esquerda). Para trocar, use o seletor de idioma no rodapé; a escolha fica salva neste navegador e passa a valer em todas as visitas.

Nomes de feriados e datas comemorativas brasileiras ficam em português, por serem nomes próprios. Esta documentação existe em português e inglês.

Fuso horário

A hora da página inicial é exibida no fuso configurado no seu aparelho, lido com Intl.DateTimeFormat().resolvedOptions().timeZone. O GlobalTime não pede a sua localização para isso — e o fuso do aparelho não indica, por si, onde você está.

Para escolher outro, clique no nome do lugar acima do relógio. A escolha fica salva; selecione “Automático” para voltar ao fuso do aparelho. Quando o fuso exibido tem outra hora, o horário de Brasília aparece logo abaixo da data.

Trocar o fuso só muda a forma de exibir: o instante continua vindo do relógio sincronizado com o servidor. O relógio mundial, o conversor, o despertador e a contagem regressiva começam pelo fuso escolhido.

Atalhos de teclado

Pressione H (ou ?) em qualquer página para ver os atalhos dela; o botão “Atalhos de teclado”, no rodapé e perto dos controles das ferramentas, faz o mesmo.

TeclaAçãoOnde
EspaçoIniciar, pausar ou continuarCronômetro, temporizador, Pomodoro
LRegistrar voltaCronômetro
RZerar ou reiniciar (pede confirmação quando há dados a perder)Cronômetro, temporizador, Pomodoro
+Adicionar 1 minutoTemporizador
NPular para a próxima etapaPomodoro
F / MTela cheia / alternar digital e analógicoTela cheia
Setas, PageUp, PageDown, HomeMudar de dia, de período e voltar a hojeCalendário
H ou ?Mostrar os atalhosTodas
EscFechar janelas e sair de modosTodas

Os atalhos não funcionam enquanto você digita em um campo nem com uma janela aberta, e nunca usam Ctrl, Alt ou ⌘, para não conflitar com o navegador e o sistema. As letras valem em qualquer layout: em teclados cirílicos, árabes ou coreanos conta a posição física da tecla. Zerar um cronômetro com voltas (ou com mais de um minuto medido) pede confirmação.

Como a sincronização funciona

O relógio do seu computador ou celular pode estar adiantado ou atrasado. Por isso o GlobalTime compara o seu relógio com o do servidor:

  1. O navegador consulta /api/hora, que devolve o horário do servidor em milissegundos, com cabeçalhos que proíbem cache.
  2. O envio e o recebimento são medidos com performance.now(), que não muda quando alguém ajusta o relógio do sistema.
  3. Supomos que o servidor leu o relógio no meio da viagem: na chegada, a hora do servidor é o valor recebido mais metade do tempo de ida e volta.
  4. Ao abrir a página são feitas até cinco medições; usamos a de menor latência, a menos afetada por filas na rede.
  5. Entre sincronizações, a hora avança com performance.now() a partir dessa medição.
  6. A cada 10 minutos há uma nova rodada (três medições), e também quando a aba volta a ficar visível depois de mais de um minuto, quando a conexão volta e quando a página é restaurada do histórico.
  7. A cada 5 segundos o avanço do cronômetro interno é comparado com o do relógio do sistema; se divergirem mais de 2 segundos (suspensão, ajuste de relógio), a sincronização é refeita na hora.
  8. Cada consulta tem limite de 5 segundos, e respostas atrasadas nunca sobrescrevem uma medição mais nova.

Se o servidor de horário falhar

  1. Servidor do GlobalTime (/api/hora), com resolução de milissegundos.
  2. Cabeçalho HTTP Date de um arquivo do próprio site: resolução de 1 segundo; o servidor é tentado de novo a cada minuto.
  3. Relógio do seu aparelho, sem correção, se nada responder. Se uma sincronização anterior deu certo, o relógio continua corrigido por ela.

Precisão e estados do relógio

Na página inicial, o estado aparece discreto no canto superior direito do relógio. Clique nele para ver a janela Precisão do relógio: fonte usada, latência, diferença do seu relógio e incerteza estimada — metade do tempo de ida e volta, o maior erro que a rede pode ter causado supondo que o servidor esteja certo.

Ela não é uma garantia de precisão absoluta: o relógio do servidor (Vercel) é mantido por NTP e não é uma fonte oficial de hora atômica; a estimativa supõe ida e volta com a mesma duração; e a tela só muda quando o navegador desenha um novo quadro. Diferenças de até 0,1 s aparecem como “em dia”.

Estados

EstadoSignificado
Sincronizando…Medindo a diferença entre o seu relógio e o servidor.
SincronizadoHorário corrigido pelo servidor do GlobalTime.
Precisão limitadaServidor indisponível; usando o cabeçalho HTTP Date.
Usando relógio do aparelhoNenhuma fonte respondeu; horário do aparelho, sem correção.
Offline · última sincronizaçãoSem internet, ainda corrigido pela última sincronização.
OfflineSem internet e sem sincronização anterior.

Fusos horários

Os horários de outras cidades são calculados com a base oficial de fusos (IANA) embutida no navegador, pela API Intl.DateTimeFormat — nunca somando horas fixas —, então as regras de horário de verão de cada lugar são respeitadas. O Brasil não adota horário de verão desde 2019.

  • Relógio mundial: começa com poucas cidades a partir do seu fuso; adicione, reordene e remova cidades. A lista fica salva neste navegador.
  • Conversor: converte um horário entre cidades ou fusos IANA, avisa horários inexistentes ou repetidos na troca do horário de verão e tem um planejador de reuniões.
  • Tela cheia: relógio grande para TVs e monitores, com fusos extras; os ajustes ficam no endereço da página.

Cronômetro

Mede o tempo com performance.now() durante a sessão, então não é afetado por ajustes do relógio do sistema. Registre voltas com L; a lista mostra o tempo de cada volta, a diferença para a anterior, o total e destaca a melhor e a pior. Ela tem rolagem própria, para não esticar a página.

Copie os resultados ou exporte um CSV (separador ;, com colunas em milissegundos exatos). Se a página for recarregada, o cronômetro continua de onde estava.

Temporizador e Pomodoro

A contagem é calculada a partir do instante final, não subtraindo segundos: o tempo restante continua certo mesmo se o navegador atrasar a aba em segundo plano. Ao terminar, toca o som escolhido (até 5 minutos, se “Repetir” estiver ligado) e, se você permitiu, aparece uma notificação do sistema. Se a página estava fechada, ela informa quando o tempo acabou.

O Pomodoro alterna foco, pausa curta e pausa longa com durações ajustáveis e guarda o histórico do dia neste navegador. Som, notificações e “manter a tela ligada” ficam em seções recolhíveis.

Despertador e contagem regressiva

Os alarmes usam o horário sincronizado e podem ter data, repetição semanal, fuso e som. Eles só tocam com a página aberta: com a aba ou o navegador fechados, nada toca, e celulares podem suspender abas em segundo plano. Para compromissos importantes, use também o despertador do aparelho.

A contagem regressiva mostra quanto falta para uma data em qualquer fuso e gera um link para compartilhar. As contagens salvas aparecem no calendário.

Calculadoras, timestamp e sol

  • Calculadoras: diferença entre datas (com dias úteis descontando feriados nacionais e, se escolhidos, estaduais), soma de dias corridos ou úteis, duração entre horários e conversão de unidades.
  • Timestamp Unix: converte segundos ou milissegundos em datas (ISO 8601, UTC e no fuso escolhido) e o caminho inverso.
  • Nascer e pôr do sol: cálculo pelo algoritmo da NOAA para cidades ou coordenadas. A localização só é pedida se você clicar em “Usar minha localização”, e as coordenadas não saem do navegador.

Calendário

O calendário abre no ano inteiro, com os 12 meses em grade. Use os botões Ano, Mês e Semana para trocar a visualização; a data selecionada é mantida. As setas avançam ou voltam um período e “Hoje” volta ao período atual. Clique no nome de um mês para abri-lo.

Feriados nacionais, estaduais e da capital escolhida, pontos facultativos, datas comemorativas, as suas contagens e os seus eventos aparecem em todas as visualizações. O painel ao lado mostra os detalhes do dia selecionado.

Eventos e conta

Crie eventos com título, data, horário e descrição opcionais e a opção “Repetir todo ano”, para aniversários (29 de fevereiro aparece em 28 de fevereiro nos anos não bissextos). Edite ou exclua pelo painel do dia; dois cliques num dia (ou Enter) criam um evento nele.

Sem conta

Os eventos ficam só neste navegador (armazenamento local). Apagar os dados do site os remove.

Com conta

Com e-mail e senha, os eventos ficam no servidor e aparecem em qualquer aparelho em que você entrar. Ao entrar, o GlobalTime oferece levar para a conta os eventos que estavam só no navegador.

  • A senha é guardada com scrypt e sal aleatório; o servidor nunca guarda a senha em si.
  • A sessão usa um cookie HttpOnly, SameSite=Lax e Secure, válido por 30 dias.
  • Tentativas de entrar são limitadas, e cada conta só acessa os próprios eventos.
  • Ainda não há recuperação de senha por e-mail. Você pode excluir a conta e todos os eventos a qualquer momento, confirmando a senha.

Dados de feriados

Os dados foram compilados em 19/10/2026 a partir de leis e calendários oficiais; cada data traz a base legal e a fonte.

  • Nacionais: Lei nº 662/1949 (redação da Lei nº 10.607/2002), Lei nº 6.802/1980 e Lei nº 14.759/2023 (20 de novembro, nacional desde 2024).
  • Pontos facultativos não são feriados: valem para a administração pública federal (em 2026, Portaria MGI nº 11.460/2025).
  • Datas móveis (Carnaval, Sexta-feira Santa, Páscoa, Corpus Christi) são calculadas a partir da Páscoa.
  • Estaduais: verificados para 24 unidades da federação; MG, MT e PR não têm feriado estadual próprio.
  • Municipais: apenas 21 capitais com lei localizada. Confirme com a prefeitura da sua cidade.

Uso sem internet

O GlobalTime é um aplicativo web instalável (PWA). Depois da primeira visita, páginas, estilos, fontes, traduções e scripts ficam guardados, e as ferramentas que não dependem da rede funcionam offline.

A sincronização precisa de internet e nunca vai para o cache — um horário guardado seria um horário errado. As contas e os eventos guardados na conta também precisam de conexão. Quando há uma nova versão, aparece o aviso “Atualizar”.

Permissões do navegador

  • Som: só é liberado depois de uma interação, por isso é preparado quando você clica em Iniciar.
  • Notificações: pedidas só quando você clica em Ativar.
  • Manter a tela ligada: disponível em parte dos navegadores; solto quando a aba fica oculta e pedido de novo quando ela volta.
  • Tela cheia: só por clique ou tecla; Esc sai.
  • Localização: usada apenas no nascer e pôr do sol, e só se você pedir.

Privacidade

  • Sem anúncios, rastreadores ou análise de audiência. Fontes e ícones vêm do próprio site.
  • Preferências (idioma, tema, fuso), cronômetros, alarmes, cidades, históricos e eventos sem conta ficam no localStorage do navegador.
  • Com conta, o servidor guarda apenas o e-mail, a senha protegida e os seus eventos.
  • A consulta de horário não envia dados pessoais nem cookies.

Estrutura do projeto

Site estático em HTML, CSS e JavaScript puro, sem etapa de build nem dependências em produção, com Vercel Functions em api/.

  • *.html — páginas; cabeçalho, rodapé e metadados são mantidos por dev/gerar.mjs a partir de dev/site.mjs.
  • scripts/nucleo/ — lógica sem DOM (tempo, sincronização, calendário, eventos) e componentes.
  • scripts/paginas/ — um script por página. scripts/i18n/ — idiomas e traduções.
  • api/hora.js, api/conta.js, api/eventos.js — funções; auxiliares em api/_lib/.
  • sw.js — service worker (pré-cache gerado).

Executar e testar

Requer Node.js 20 ou superior; não há pacotes para instalar.

npm run dev              # http://localhost:3000
npm run gerar            # atualiza cabeçalho, rodapé, textos, sitemap e service worker
npm run checar           # falha se algo estiver desatualizado
npm test                 # testes de unidade e das funções
npm run test:navegador   # todas as páginas no Chrome/Edge (desktop e celular)
npm run test:pwa         # service worker e uso offline

No servidor local, as contas usam um armazenamento em memória (apagado ao reiniciar). Opções dos testes de navegador: SO=/cronometro (uma página), FUSO=Asia/Tokyo, TEMA=dark e INTEIRA=1 (captura da página inteira).

Implantação na Vercel

O projeto é publicado na Vercel como está. As contas de usuário precisam de um banco Redis: crie um Upstash Redis pelo Marketplace da Vercel (há plano gratuito) e conecte-o ao projeto. A Vercel cria as variáveis:

KV_REST_API_URL=…
KV_REST_API_TOKEN=…

Os nomes UPSTASH_REDIS_REST_URL e UPSTASH_REDIS_REST_TOKEN também são aceitos. Sem essas variáveis o site funciona normalmente e os eventos ficam só no navegador. Defina SITE_URL ao rodar npm run gerar para o endereço público usado no sitemap.

API

GET /api/hora

Devolve o horário do servidor em milissegundos, sem cache.

curl https://SEU-DOMINIO/api/hora
# {"timestamp":1792519155792}

/api/conta

GET informa se as contas estão disponíveis e qual conta está conectada. POST com acao igual a cadastrar, entrar ou sair; DELETE com a senha exclui a conta. Pedidos que mudam dados precisam de JSON e da mesma origem.

await fetch("/api/conta", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ acao: "entrar", email: "voce@exemplo.com", senha: "…" }),
});

/api/eventos

Com sessão aberta: GET lista, POST cria, PUT ?id= atualiza e DELETE ?id= exclui. Campos: titulo, data (AAAA-MM-DD), hora (HH:MM, opcional), descricao e anual.

await fetch("/api/eventos", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ titulo: "Aniversário", data: "2026-03-14", anual: true }),
});

Traduções

Os textos ficam em scripts/i18n/textos/: pt-BR.js é a referência, e cada idioma tem um arquivo com as mesmas chaves (os testes conferem). No HTML, elementos com data-i18n são preenchidos em português pelo gerador e traduzidos no navegador; nos scripts, use t("chave", { parametros }). Para incluir um idioma, adicione-o em scripts/i18n/idiomas.js e crie o arquivo de textos.