moment.js 不将具有特定时区的时间戳转换为 unix 时间戳

moment.js does not convert timestamps with specific timezones to unix timestamps

我正在使用 moment.js 将其特定时区中的一堆时间戳转换为 unix 时间戳,如下所示:

var timestamp = "2015-12-29T09:35:00.000-08:00";
console.log(moment("2015-12-29T09:35:00.000-08:00").unix();
console.log(moment("2015-12-29T09:35:00.000-08:00").tz("America/Los_Angeles").unix();

出于某种原因,上述两个语句的控制台日志是相同的 - 1451361900。它记录的这个 unix 时间戳在我的本地时区,而不是我要求的那个:"America/Los_Angeles"。我错过了什么?

Unix 时间戳或 Posix 应始终采用 UTC(协调世界时)格式。

Moment 正在做类似的事情

function unix () {
    return Math.floor(+this / 1000);
}

将日期对象转换为整数,然后从毫秒转换为秒。

起点是一个常规的javascript日期对象,ECMA标准说

Date objects are based on a time value that is the number of milliseconds since 1 January, 1970 UTC.

所以日期对象在转换为自 1970 年 1 月 1 日(纪元)以来的毫秒数时始终为 UTC,即您不能在 Unix 时间戳上设置另一个时区,您的日期是相同的。

正确的方法是使用moment-Timezone是这样的。

console.log(moment("2015-12-29T09:35:00").unix());
console.log(moment.tz("2015-12-29T09:35" , "America/Los_Angeles").unix());

在上面,您也提供了字符串形式的时区,这是最后一部分“.000-08:00”,然后您提供了另一个不正确的时区。

当您试图找出日期“2015-12-29T09:35:00.000-08:00”的 unix 时间戳时。在这种日期格式中,时区值已经存在,即“-08:00”,因此您会得到相同的 unix 时间戳。

为了获得 unix 时间戳所需的解决方案,删除时区值并使用 moment-timezone 作为:

console.log(moment.tz("2013-12-01", "America/Los_Angeles").unix());

有关详细信息,请查看 moment-timezone