如何将moment.js时区与toDate结合使用以构建新的日期对象?

时间:2016-08-05 00:11:50

标签: javascript momentjs

我想将本地日期对象转换为另一个时区的日期对象,这就是我所拥有的:

moment("2016-08-04T23:30:37Z").tz("Asia/Hong_Kong").format("M/DD/YYYY h:mm a")

>>"8/05/2016 7:30 am"

但如果我这样做

moment("2016-08-04T23:30:37Z").tz("Asia/Hong_Kong").toDate()

>>Thu Aug 04 2016 16:30:37 GMT-0700 (PDT)

正如您所看到的,我可以将时刻对象格式化为我喜欢的格式,但如何将其再次返回到日期对象?

1 个答案:

答案 0 :(得分:0)

  

...到另一个时区的日期对象

JavaScript Date对象不能代表另一个时区。它只是一个时间戳,以1970-01-01午夜UTC时间的毫秒数为单位,您可以使用.valueOf().getTime()查看。

当您在.toString()对象上调用Date或以其他方式将其强制转换为字符串时(例如在调试控制台中显示它时),它会将时间戳转换为本地时区环境正在运行。

因此,尽管您使用时刻区域进行了任何转换,但您仍然在谈论同一时刻,因此在生成的Date对象中将具有相同的时间戳。

换句话说,这些都是等价的:

moment("2016-08-04T23:30:37Z").toDate()
moment.utc("2016-08-04T23:30:37Z").toDate()
moment("2016-08-04T23:30:37Z").tz("Asia/Hong_Kong").toDate()
new Date("2016-08-04T23:30:37Z")

...因为它们都具有相同的内部时间戳1470353437000

moment("2016-08-04T23:30:37Z").valueOf()                       // 1470353437000
moment.utc("2016-08-04T23:30:37Z").valueOf()                   // 1470353437000
moment("2016-08-04T23:30:37Z").tz("Asia/Hong_Kong").valueOf()  // 1470353437000
new Date("2016-08-04T23:30:37Z").valueOf()                     // 1470353437000