使用Moment.js,我无法将一个正确的时刻对象转化为一个带有时区的日期对象。我无法得到正确的日期。
例子:
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())
只要你用你想要的区域的数据初始化了时刻-时区,你的代码就能按预期工作。
你正确地将时刻转换为时区,这反映在momentObj.format()
的第二行输出中。
切换到UTC并不只是放弃偏移量,而是变回了UTC时区。 如果你打算这样做,你根本不需要原来的.tz()
调用。 你可以只做 "moment.utc()"。
也许你只是想改变输出的格式字符串? 如果是这样,只需向format
方法指定你想要的参数。
momentObj.format("YYYY-MM-DD HH:mm:ss")
关于你代码的最后几行--当你使用toDate()
回到一个日期'对象时,你放弃了 moment.js 的行为,回到了 JavaScript 的行为。 一个JavaScript的
Date'对象将总是被打印在它所运行的计算机的本地时区。 moment.js对此无能为力。
还有几件小事。
虽然时刻构造函数可以接受Date',但通常最好不要使用。 对于"现在",不要使用
moment(new Date())。 相反,只需使用
moment()`。 两者都可以使用,但这是不必要的重复。 如果你要从一个字符串中解析,请将该字符串直接传给moment。 不要试图先把它解析为 "日期"。 你会发现moment'的解析器更加可靠。
像MST7MDT
这样的时区是为了向后兼容的原因。 它们源于POSIX风格的时区,而且只有少数在TZDB数据中。除非绝对必要,你应该使用America/Denver
这样的键。