协慌网

登录 贡献 社区

Moment.js 转换为日期对象

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

答案

使用此方法可以将矩对象转换为日期对象:

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

moment().toDate();

产量:

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

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

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

切换到 UTC 不仅会减少偏移量,还会改回到 UTC 时区。如果要这样做,则根本不需要原始的.tz()调用。你可以做moment.utc()

也许您只是想更改输出格式字符串?如果是这样,只需将所需的参数指定给format方法:

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

关于代码的最后toDate() Date对象时,您将放弃 moment.js 的行为并返回到 JavaScript 的行为。 JavaScript Date对象将始终在运行它的计算机的本地时区中打印。瞬间,js 对此无能为力。

其他一些小事情:

  • 尽管构造函数可以使用Date ,但通常最好不要使用 Date。对于 “now”,请不要使用moment(new Date()) 。相反,只需使用moment() 。两者都可以,但是不必要地多余。如果要从字符串中进行解析,请将该字符串直接传递到 moment 中。不要尝试先将其解析为Date您会发现瞬间的解析器更加可靠。

  • MST7MDT这样的时区是出于向后兼容的原因而存在的。它们源于 POSIX 样式的时区,并且其中只有少数位于 TZDB 数据中。除非绝对必要,否则应使用America/Denver类的密钥。

.toDate并不是真的为我工作,所以,这就是我所做的:

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

希望这可以帮助