Formate datas em JavaScript sem biblioteca: um gerador de Intl.DateTimeFormat ao vivo, código para YYYY-MM-DD e MM/DD/YYYY, fusos horários, tempo relativo, intervalos e as armadilhas de parsing por trás dos bugs de um dia a menos.
Para formatar uma data em JavaScript, use Intl.DateTimeFormat ou toLocaleDateString com um locale e opções, por exemplo date.toLocaleDateString("en-US", { dateStyle: "long" }) para March 5, 2026. Use toISOString() para APIs, a opção timeZone para mostrar outro fuso e Intl.RelativeTimeFormat para expressões como há 3 dias.
Respostas rápidas
Escolha um locale e as opções no gerador e copie o código que ele escreve; a prévia é formatada pelo seu próprio navegador. Abaixo dele, uma tabela de formatos do dia a dia e exemplos executáveis para fusos, tempo relativo e intervalos.
Use o ano local, o mês mais um e o dia, completados com padStart(2, "0"), e junte-os com hífens. toISOString().slice(0, 10) também gera esse formato, mas em UTC, então pode mostrar o dia errado perto da meia-noite.
new Date("2026-03-05") é lido como meia-noite UTC. A oeste de Greenwich, esse instante ainda é dia 4 no horário local. Faça o parsing com uma hora ("2026-03-05T00:00") ou com new Date(2026, 2, 5) para obter a meia-noite local.
Não para formatar. O Intl cobre locales, fusos horários e tempo relativo em todos os navegadores modernos. Os próprios mantenedores do Moment o descrevem como um projeto legado; para aritmética de datas, uma biblioteca pequena como date-fns ou a API Temporal, mais nova (onde estiver disponível), funciona bem.
Passe timeZone com um nome IANA, por exemplo { timeZone: "America/New_York", timeStyle: "short" }. O objeto Date continua sendo o mesmo instante; só muda a forma como ele é escrito.
Formatos comuns e o código de cada um
Uma string ISO só com data é lida como meia-noite UTC, mas uma string de data e hora sem offset é lida como horário local. Essa diferença causa a maioria dos bugs de um dia a menos.
Monte a partir das partes locais com padStart. O truque do locale en-CA dá o mesmo resultado, mas depende de o formato desse locale continuar igual.
timeZone recebe um nome IANA. O Date em si não tem fuso; só a formatação muda. Note que timeZoneName não pode ser combinado com dateStyle ou timeStyle.
Intl.RelativeTimeFormat escreve as palavras; você escolhe a unidade. Este helper escolhe a maior unidade que couber.
formatRange remove as partes repetidas, então uma reserva do dia 5 ao dia 9 do mesmo mês fica natural de ler.
Quando nenhum padrão serve, pegue as partes localizadas e organize-as você mesmo, por exemplo para deixar o dia maior que o mês.
Trabalhando com segundos desde a epoch? Use o
Opções de Intl.DateTimeFormat usadas no gerador
(nenhum)
(seu fuso)
Erro: {msg}
Data e hora
Locale
Fuso horário
Modo
Estilos predefinidos
Escolher cada parte
Copiar código
Comece grátis · Sem cartão de crédito