Usando o Moment.js eu posso't transformar um objeto de momento correto em um objeto de data com fusos horários. Eu posso't obter a data correta.
Exemplo:
var oldDate = new Date(),
momentObj = moment(oldDate).tz("MST7MDT"),
newDate = momentObj.toDate();
console.log("start date " + oldDate)
console.log("Format from moment with offset " + momentObj.format())
console.log("Format from moment without offset " + momentObj.utc().format())
console.log("(Date object) Time with offset " + newDate)
console.log("(Date object) Time without offset "+ moment.utc(newDate).toDate())
Use isto para transformar um objeto de momento em um objeto de data:
A partir de http://momentjs.com/docs/#/displaying/as-javascript-date/
moment().toDate();
Rendimentos:
Tue Nov 04 2014 14:04:01 GMT-0600 (CST)
Desde que você tenha iniciado moment timezone com os dados para as zonas que você quer, seu código funciona como esperado.
Você está convertendo corretamente o momento para o fuso horário, que é refletido na segunda linha de saída do momentObj.format()
.
Mudar para o UTC não se limita a largar o offset, ele muda de volta para o fuso horário UTC. Se você vai fazer isso, você não precisa da chamada original .tz()
de jeito nenhum. Você pode simplesmente fazer moment.utc()
.
Talvez esteja apenas a tentar alterar a string de formato de saída? Se sim, basta especificar os parâmetros que você quer para o método format
:
momentObj.format("YYYY-MM-DD HH:mm:ss")
Quanto às últimas linhas do seu código - quando você volta a um objeto Date
utilizando toDate()
, você está desistindo do comportamento do moment.js e voltando ao comportamento do JavaScript. Um objeto JavaScript Date
será sempre impresso no fuso horário local do computador em que ele está rodando. Não há nada que o moment.js possa fazer quanto a isso.
Um par de outras pequenas coisas:
Enquanto o momento em que o construtor pode tomar uma "data", normalmente é melhor não utilizar uma. Para "agora", não utilize moment(new Date())
. Ao invés disso, apenas utilize moment()
. Ambos funcionarão, mas é desnecessariamente redundante. Se você estiver analisando a partir de uma string, passe essa string diretamente para o momento. Não tente analisá-la para um Date
primeiro. Você vai achar o analisador do momento muito mais confiável.
Fusos horários como MST7MDT
estão lá por razões de compatibilidade com o passado. Eles provêm de fusos horários estilo POSIX, e apenas alguns deles estão nos dados do TZDB. A menos que seja absolutamente necessário, você deve utilizar uma chave como `America/Denver'.