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.
| Tecla | Ação | Onde |
|---|---|---|
| Espaço | Iniciar, pausar ou continuar | Cronômetro, temporizador, Pomodoro |
| L | Registrar volta | Cronômetro |
| R | Zerar ou reiniciar (pede confirmação quando há dados a perder) | Cronômetro, temporizador, Pomodoro |
| + | Adicionar 1 minuto | Temporizador |
| N | Pular para a próxima etapa | Pomodoro |
| F / M | Tela cheia / alternar digital e analógico | Tela cheia |
| Setas, PageUp, PageDown, Home | Mudar de dia, de período e voltar a hoje | Calendário |
| H ou ? | Mostrar os atalhos | Todas |
| Esc | Fechar janelas e sair de modos | Todas |
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:
- O navegador consulta
/api/hora, que devolve o horário do servidor em milissegundos, com cabeçalhos que proíbem cache. - O envio e o recebimento são medidos com
performance.now(), que não muda quando alguém ajusta o relógio do sistema. - 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.
- 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.
- Entre sincronizações, a hora avança com
performance.now()a partir dessa medição. - 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.
- 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.
- Cada consulta tem limite de 5 segundos, e respostas atrasadas nunca sobrescrevem uma medição mais nova.
Se o servidor de horário falhar
- Servidor do GlobalTime (
/api/hora), com resolução de milissegundos. - Cabeçalho HTTP
Datede um arquivo do próprio site: resolução de 1 segundo; o servidor é tentado de novo a cada minuto. - 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
| Estado | Significado |
|---|---|
| Sincronizando… | Medindo a diferença entre o seu relógio e o servidor. |
| Sincronizado | Horário corrigido pelo servidor do GlobalTime. |
| Precisão limitada | Servidor indisponível; usando o cabeçalho HTTP Date. |
| Usando relógio do aparelho | Nenhuma fonte respondeu; horário do aparelho, sem correção. |
| Offline · última sincronização | Sem internet, ainda corrigido pela última sincronização. |
| Offline | Sem 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
scrypte sal aleatório; o servidor nunca guarda a senha em si. - A sessão usa um cookie
HttpOnly,SameSite=LaxeSecure, 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
localStoragedo 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 pordev/gerar.mjsa partir dedev/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 emapi/_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.