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):
>>> moment('07-18-2013', 'MM-DD-YYYY').utc().format("YYYY-MM-DD HH:mm")
"2013-07-17 21:00"
>>> moment('07-18-2013 12:00', 'MM-DD-YYYY HH:mm').utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 09:00"
>>> Date()
"Thu Jul 25 2013 14:28:45 GMT+0300 (Jerusalem Daylight Time)"
Se quiser que a string de data e hora seja interpretada como UTC, você deve ser explícito sobre isso:
>>> moment(new Date('07-18-2013 UTC')).utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"
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.
>>> moment.utc('07-18-2013', 'MM-DD-YYYY').format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"
Para fazer o contrário e converter uma data UTC em uma data local, você pode usar o local()
método da seguinte maneira:
>>> moment.utc('07-18-2013', 'MM-DD-YYYY').local().format("YYYY-MM-DD HH:mm")
"2013-07-18 03:00"
toString()
depoisformat()
(já retorna uma string).