Moment.js转换为date对象

使用Moment.js我无法将正确的时刻对象转换为具有时区的date对象。 我无法得到正确的date。

例:

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()) 

用这个将一个片刻对象转换成一个date对象:

http://momentjs.com/docs/#/displaying/as-javascript-date/

 moment().toDate(); 

产量:

 Tue Nov 04 2014 14:04:01 GMT-0600 (CST) 

只要您使用所需区域的数据初始化了时 区 ,您的代码就能按预期工作。

您正在将时刻转换为时区,这反映在momentObj.format()的第二行输出中。

切换到UTC不仅会使偏移量下降,而且还会变回UTC时区。 如果你打算这样做,你根本不需要原始的.tz()调用。 你可以做moment.utc()

也许你只是想改变输出格式string? 如果是这样,只需要指定format方法的参数:

 momentObj.format("YYYY-MM-DD HH:mm:ss") 

关于你的代码的最后一行 – 当你使用toDate()返回一个Date对象时,你放弃了moment.js的行为,并回到JavaScript的行为。 JavaScript Date对象将始终打印在正在运行的计算机的本地时区中。 没有什么可以做的。

其他一些小东西:

  • 虽然构造函数可以采用Date ,但通常最好不要使用Date 。 对于“now”,不要使用moment(new Date()) 。 相反,只需使用moment() 。 两者都可以工作,但不必要的多余。 如果你正在从一个stringparsing,那么直接传递这个string。 不要试图先将它parsing为Date 。 你会发现时刻的parsing器更可靠。

  • MST7MDT时区是出于向下兼容的原因。 它们源于POSIX风格的时区,其中只有less数在TZDB数据中。 除非绝对必要,否则您应该使用America/Denver这样的密钥。

.toDate真的不适合我,所以,这是我做的:

 futureStartAtDate = new Date(moment().locale("en").add(1, 'd').format("MMM DD, YYYY HH:MM")) 

希望这可以帮助

我需要在我的datestring中有时区信息。 我最初是使用moment.tz(dateStr, 'America/New_York').toString(); 但是后来我开始犯错误,把那个string喂回去。

我尝试了这个moment.tz(dateStr, 'America/New_York').toDate(); 但后来我失去了我需要的时区信息。

返回可用datestring的唯一解决scheme是moment.tz(dateStr, 'America/New_York').format();