ES2026 Temporal API: O Fim do Sofrimento Com Datas em JavaScript
Ola HaWkers, depois de anos de espera e desenvolvimento, a Temporal API finalmente faz parte do ECMAScript 2026. Essa nova API promete resolver os problemas historicos que todo desenvolvedor JavaScript enfrentou ao trabalhar com datas e horarios.
Vamos explorar o que muda, como usar, e por que voce vai querer abandonar o objeto Date o mais rapido possivel.
O Problema Com Date
Por Que Date e Tao Ruim
O objeto Date do JavaScript foi copiado do Java 1.0 em 1995 e herdou todos os seus problemas. A propria linguagem Java ja deprecou a maioria dos metodos originais.
Problemas classicos:
// Meses comecam em 0 (Janeiro = 0, nao 1)
const data = new Date(2026, 0, 15); // 15 de Janeiro, nao Fevereiro
// Mutabilidade inesperada
const original = new Date();
const copia = original;
copia.setMonth(5); // Ops, mudou o original tambem!
// Parsing inconsistente entre browsers
new Date('2026-01-15'); // Pode ser interpretado diferente
// Timezone hell
const local = new Date();
const utc = new Date(local.toISOString());
// Qual e a diferenca? Depende de onde voce esta
// Operacoes matematicas estranhas
const d1 = new Date(2026, 0, 31);
d1.setMonth(1); // Deveria ser 31 de Fevereiro?
// Na verdade vira 3 de Marco (overflow automatico)Por que bibliotecas existem:
Moment.js, date-fns, Luxon e Day.js existem precisamente porque Date e inadequado para trabalho serio. Mas adicionar dependencias para algo tao fundamental sempre foi subotimo.
A Temporal API
Conceitos Fundamentais
A Temporal API introduz varios novos tipos, cada um com proposito especifico.
Tipos principais:
| Tipo | Proposito | Exemplo |
|---|---|---|
Temporal.Instant |
Momento exato no tempo (UTC) | Timestamp de log |
Temporal.ZonedDateTime |
Data/hora com timezone | Hora de reuniao |
Temporal.PlainDateTime |
Data/hora sem timezone | Hora local generica |
Temporal.PlainDate |
Apenas data | Data de nascimento |
Temporal.PlainTime |
Apenas hora | Alarme |
Temporal.Duration |
Duracao | 2 horas e 30 minutos |
Principio fundamental:
"Cada tipo representa exatamente o que voce precisa - nada mais, nada menos."
Imutabilidade
Todos os objetos Temporal sao imutaveis. Operacoes retornam novos objetos.
// Temporal - imutavel e seguro
const data = Temporal.PlainDate.from('2026-01-15');
const proximoMes = data.add({ months: 1 });
console.log(data.toString()); // 2026-01-15 (nao mudou!)
console.log(proximoMes.toString()); // 2026-02-15
// Comparacao com Date - mutavel e perigoso
const dataAntiga = new Date('2026-01-15');
dataAntiga.setMonth(dataAntiga.getMonth() + 1);
// Original foi modificado!
Exemplos Praticos
Trabalhando Com Datas
Operacoes comuns ficam muito mais intuitivas.
// Criar uma data
const aniversario = Temporal.PlainDate.from('2026-06-15');
// ou
const aniversario2 = Temporal.PlainDate.from({
year: 2026,
month: 6,
day: 15
});
// Adicionar/subtrair tempo
const emUmaSemana = aniversario.add({ weeks: 1 });
const haTresDias = aniversario.subtract({ days: 3 });
// Comparar datas (finalmente faz sentido!)
const hoje = Temporal.Now.plainDateISO();
if (Temporal.PlainDate.compare(aniversario, hoje) > 0) {
console.log('O aniversario ainda nao chegou');
}
// Calcular diferenca
const diasAteAniversario = hoje.until(aniversario, {
largestUnit: 'day'
});
console.log(`Faltam ${diasAteAniversario.days} dias`);Trabalhando Com Timezones
Timezones deixam de ser um pesadelo.
// Criar data/hora com timezone
const reuniao = Temporal.ZonedDateTime.from({
year: 2026,
month: 1,
day: 27,
hour: 15,
minute: 0,
timeZone: 'America/Sao_Paulo'
});
console.log(reuniao.toString());
// 2026-01-27T15:00:00-03:00[America/Sao_Paulo]
// Converter para outro timezone
const reuniaoEmNY = reuniao.withTimeZone('America/New_York');
console.log(reuniaoEmNY.toString());
// 2026-01-27T13:00:00-05:00[America/New_York]
// Obter hora atual em timezone especifico
const agoraEmTokyo = Temporal.Now.zonedDateTimeISO('Asia/Tokyo');
console.log(`Em Tokyo sao ${agoraEmTokyo.hour}:${agoraEmTokyo.minute}`);
Trabalhando Com Duracoes
Duracoes tem representacao propria e operacoes intuitivas.
// Criar duracao
const tempoDeCorrida = Temporal.Duration.from({
hours: 1,
minutes: 45,
seconds: 30
});
// Operacoes com duracao
const duasCorridas = tempoDeCorrida.add(tempoDeCorrida);
console.log(duasCorridas.toString()); // PT3H31M
// Arredondar duracao
const arredondado = tempoDeCorrida.round({
smallestUnit: 'minute',
roundingMode: 'ceil'
});
console.log(arredondado.toString()); // PT1H46M
// Calcular duracao entre dois momentos
const inicio = Temporal.PlainTime.from('09:00');
const fim = Temporal.PlainTime.from('17:30');
const jornada = inicio.until(fim);
console.log(`Jornada: ${jornada.hours}h ${jornada.minutes}min`);Formatacao
A formatacao e integrada com Intl.
const data = Temporal.PlainDate.from('2026-01-27');
// Formatacao com Intl
const formatoBR = new Intl.DateTimeFormat('pt-BR', {
dateStyle: 'full'
});
console.log(formatoBR.format(data));
// terça-feira, 27 de janeiro de 2026
// Formatacao customizada
const formatoCustom = new Intl.DateTimeFormat('pt-BR', {
weekday: 'short',
day: 'numeric',
month: 'short'
});
console.log(formatoCustom.format(data));
// ter., 27 de jan.
Casos de Uso Comuns
Agendamento de Eventos
Um caso classico que Date torna complicado.
// Agendar evento recorrente
function proximasOcorrencias(
inicio,
intervalo,
quantidade
) {
const ocorrencias = [];
let atual = inicio;
for (let i = 0; i < quantidade; i++) {
ocorrencias.push(atual);
atual = atual.add(intervalo);
}
return ocorrencias;
}
const primeiraReuniao = Temporal.ZonedDateTime.from({
year: 2026,
month: 2,
day: 1,
hour: 10,
minute: 0,
timeZone: 'America/Sao_Paulo'
});
const reunioesSemanais = proximasOcorrencias(
primeiraReuniao,
{ weeks: 1 },
4
);
reunioesSemanais.forEach((r, i) => {
console.log(`Reuniao ${i + 1}: ${r.toPlainDate().toString()}`);
});
// Reuniao 1: 2026-02-01
// Reuniao 2: 2026-02-08
// Reuniao 3: 2026-02-15
// Reuniao 4: 2026-02-22Calculo de Idade
Outro caso que Date torna desnecessariamente complicado.
function calcularIdade(dataNascimento) {
const nascimento = Temporal.PlainDate.from(dataNascimento);
const hoje = Temporal.Now.plainDateISO();
const duracao = nascimento.until(hoje, {
largestUnit: 'year'
});
return {
anos: duracao.years,
meses: duracao.months,
dias: duracao.days
};
}
const idade = calcularIdade('1990-05-15');
console.log(`${idade.anos} anos, ${idade.meses} meses e ${idade.dias} dias`);
Trabalhando Com Calendarios
A Temporal API suporta multiplos sistemas de calendario.
// Calendario gregoriano (padrao)
const dataGregoria = Temporal.PlainDate.from('2026-01-27');
// Converter para calendario hebraico
const dataHebraica = dataGregoria.withCalendar('hebrew');
console.log(dataHebraica.toString());
// Exemplo: 2026-01-27[u-ca=hebrew]
// Calendario japones
const dataJaponesa = dataGregoria.withCalendar('japanese');
console.log(`Era: ${dataJaponesa.era}, Ano: ${dataJaponesa.eraYear}`);
// Calendario islamico
const dataIslamica = dataGregoria.withCalendar('islamic');
console.log(dataIslamica.toString());Migracao de Date e Bibliotecas
De Date Para Temporal
Como converter codigo existente.
// Date para Temporal
const dateAntigo = new Date();
// Para Instant (momento exato)
const instant = Temporal.Instant.fromEpochMilliseconds(
dateAntigo.getTime()
);
// Para ZonedDateTime (com timezone local)
const zdt = instant.toZonedDateTimeISO(
Temporal.Now.timeZoneId()
);
// Para PlainDate (apenas data)
const plainDate = zdt.toPlainDate();
// Temporal para Date (quando necessario para APIs antigas)
const deVoltaParaDate = new Date(
instant.epochMilliseconds
);De Moment/Day.js Para Temporal
// Moment.js
// moment('2026-01-27').add(1, 'month').format('YYYY-MM-DD')
// Temporal equivalente
Temporal.PlainDate.from('2026-01-27')
.add({ months: 1 })
.toString();
// Day.js
// dayjs('2026-01-27').diff(dayjs('2026-01-01'), 'day')
// Temporal equivalente
Temporal.PlainDate.from('2026-01-01')
.until(Temporal.PlainDate.from('2026-01-27'))
.total('day');
Suporte e Polyfills
Status de Implementacao
Em Janeiro de 2026, o suporte esta em expansao.
Browsers:
| Browser | Status |
|---|---|
| Chrome | Disponivel (flag ate v130, padrao v135+) |
| Firefox | Em implementacao |
| Safari | Preview disponivel |
| Edge | Segue Chrome |
Runtimes:
| Runtime | Status |
|---|---|
| Node.js | Disponivel v23+ |
| Deno | Disponivel v2.0+ |
| Bun | Disponivel v1.2+ |
Usando Polyfill
Para ambientes sem suporte nativo.
// Instalacao
// npm install @js-temporal/polyfill
// Uso
import { Temporal } from '@js-temporal/polyfill';
// O codigo funciona identico ao nativo
const hoje = Temporal.Now.plainDateISO();
console.log(hoje.toString());Conclusao
A Temporal API representa uma das maiores melhorias ao JavaScript em anos. Apos decadas sofrendo com o objeto Date, finalmente temos uma API de datas e horas que faz sentido, e imutavel, e suporta timezones adequadamente.
Pontos principais:
- Temporal API faz parte do ES2026 e esta chegando aos browsers
- Multiplos tipos para diferentes necessidades (Instant, ZonedDateTime, PlainDate, etc.)
- Imutabilidade por padrao evita bugs comuns
- Timezones funcionam corretamente
- Polyfills disponiveis para uso imediato
Para desenvolvedores JavaScript, a recomendacao e: comece a usar Temporal o mais rapido possivel, seja via polyfill ou em ambientes com suporte nativo. E uma daquelas mudancas que, uma vez adotadas, voce nunca mais vai querer voltar atras.
Para mais sobre novas features do JavaScript, leia: Pattern Matching em JavaScript: A Proposta TC39 Que Vai Mudar Seu Codigo.

