Por que moment.js UTC sempre mostra a data errada? Por exemplo, no console do desenvolvedor do Chrome:
moment(('07-18-2013')).utc().format("YYYY-MM-DD").toString()
// or
moment.utc(new Date('07-18-2013')).format("YYYY-MM-DD").toString()
Ambos retornarão "2013-07-17" porque está retornando em 17 em vez de 18 , que foi aprovado.
Mas se eu usar momentjs sem o utc:
moment(new Date('07-18-2013')).format("YYYY-MM-DD").toString()
Recebo "2013-07-18", que é o que também espero ao usar o UTC moment.js.
Isso significa que não podemos obter a data correta ao usar o moment.js UTC?
toString()
depoisformat()
(já retorna uma string).Respostas:
Por padrão, o MomentJS analisa na hora local. Se apenas uma string de data (sem hora) for fornecida, o padrão de hora será meia-noite.
Em seu código, você cria uma data local e, em seguida, a converte para o fuso horário UTC (na verdade, faz a instância do momento mudar para o modo UTC ), portanto, quando é formatado, é deslocado (dependendo do seu horário local) para frente ou para trás.
Se o fuso horário local for UTC + N (N sendo um número positivo), e você analisar uma string apenas de data, obterá a data anterior.
Aqui estão alguns exemplos para ilustrar isso (minha diferença de horário local é UTC + 3 durante o horário de verão):
Se quiser que a string de data e hora seja interpretada como UTC, você deve ser explícito sobre isso:
ou, como Matt Johnson menciona em sua resposta, você pode ( e provavelmente deve ) analisá-la como uma data UTC em primeiro lugar usando
moment.utc()
e incluir a string de formato como um segundo argumento para evitar ambigüidade.Para fazer o contrário e converter uma data UTC em uma data local, você pode usar o
local()
método da seguinte maneira:fonte
new Date('07-18-2013 UTC')
não funcionará no IE8, se você se importar.Ambos
Date
emoment
irão analisar a string de entrada no fuso horário local do navegador por padrão. No entanto,Date
às vezes é inconsistente a esse respeito. Se a string estiver especificamenteYYYY-MM-DD
usando hífens , ou se estiverYYYY-MM-DD HH:mm:ss
, será interpretada como hora local . Ao contrárioDate
,moment
sempre será consistente sobre como analisa.A maneira correta de analisar um momento de entrada como UTC no formato que você forneceu seria esta:
Consulte esta documentação .
Se você quiser formatá-lo de maneira diferente para a saída, faça o seguinte:
Você não precisa chamar
toString
explicitamente.Observe que é muito importante fornecer o formato de entrada. Sem ele, uma data como
01-04-2013
pode ser processada como 4 de janeiro ou 1º de abril, dependendo das configurações de cultura do navegador.fonte
moment
no console não é muito útil. Você provavelmente está olhando para uma de suas propriedades internas. Você deve formatá-lo antes de verificar os resultados. Por exemplomoment.utc().format()
oumoment().format()
.new Date('2010-12-12')
dá-meDate {Sat Dec 11 2010 19:00:00 GMT-0500 (Eastern Daylight Time)}
em FF 38.0.5. Apenas para contextualizar o que "na hora local" significa exatamente - neste caso, parece significar, "Date
assumirá que uma string sem zona de tempo está em UTC e analisará a hora local."d.getUTCDate()
=12
ed.getDate()
=11
'2012-12-12'
é UTC b / c está em um formato ISO, mas'December 12, 2012'
e até mesmo'2012/12/12'
são analisados com um fuso horário local em ES5), mas você chegou antes de mim. Tão bom que ES6 torna todos locais [disse ele sarcasticamente]. As datas são uma dor, (c) Advento das datas