Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Fuso horário parece estar atrasado

Quando vou localizar a data com toLocaleDateString('pt-BR'), aparece como se estivesse 1 dia atrasado.
Por exemplo, ao inves de printar 19/06/2012, aparece no terminal 18/06/2012.

1 resposta
solução!

Por que a data aparece 1 dia atrasada?

E aí José!

Relaxa que esse problema pega muita gente — e não é culpa sua, é uma pegadinha clássica de como o JavaScript lida com datas.

O que tá acontecendo é o seguinte: quando você cria uma data passando só o texto no formato "2012-06-19", o JavaScript interpreta isso como meia-noite no fuso horário UTC (aquele horário de referência internacional, de Greenwich). Só que quando você usa o toLocaleDateString('pt-BR'), ele converte essa data pro seu fuso horário local. E aí, se você tá no Brasil (que geralmente é UTC-3), meia-noite em UTC vira 21h do dia anterior aqui. Por isso aparece dia 18 ao invés de dia 19.

Deixa eu mostrar na prática:

const data = new Date('2012-06-19');
console.log(data.toLocaleDateString('pt-BR')); // 18/06/2012 

Parece bug, mas é o JavaScript fazendo exatamente o que ele acha que deveria fazer (mesmo que não seja o que a gente quer).

A forma mais simples de resolver isso é adicionar o horário junto com a data, deixando claro que você quer meio-dia daquele dia (assim não tem risco de "escorregar" pro dia anterior):

const data = new Date('2012-06-19T12:00:00');
console.log(data.toLocaleDateString('pt-BR')); // 19/06/2012 

Outra opção é usar o construtor do Date passando os valores separados (ano, mês, dia). Mas atenção: nesse caso o mês começa do zero (janeiro é 0, fevereiro é 1... sim, eu sei, é estranho):

const data = new Date(2012, 5, 19); // 5 = junho (porque começa do zero, então janeiro == 0 e dezembro == 11)
console.log(data.toLocaleDateString('pt-BR')); // 19/06/2012 

Essa segunda forma funciona porque quando você passa os números separados, o JavaScript cria a data no fuso horário local, não em UTC.

Uma vez eu fui reclamar no twitter com o Brendan Eich (criador do JS), perguntando pq janeiro == 0 e ele educamente respondeu :)