momentJS:从其他时区中的日期获取错误的时间戳

时间:2019-04-24 11:46:34

标签: node.js momentjs utc moment-timezone

只有一次输入,即开始时间

我正在尝试获取这些输入的时间戳(以毫秒为单位)

let start_time = "17:05:00";
var start_date_moment = moment(start_time, "HH:mm:ss");
console.log(start_timestamp);
output is -> moment("2019-04-24T17:05:00.000")

此输出在服务器和本地上均相同

但是当我尝试以相同的方式获取以毫秒为单位的unix时间戳

var start_timestamp = moment(start_time, "HH:mm:ss").valueOf();

在不同时区的服务器上

console.log(start_timestamp);//1556125500000
console.log(moment(start_timestamp/1000).format('YYYY-MM-DD HH:mm:ss'); //2019-04-24 17:05:00

在本地

console.log(start_timestamp);//1556105700000
console.log(moment(start_timestamp/1000).format('YYYY-MM-DD HH:mm:ss'); //2019-04-24 22:35:00

此start_timestamp值在本地和服务器上不同。但是,时间戳记不应随时区改变,所有时区都应保持不变。请帮助我。

如何在两个地方都获得正确且相同的值。我得到了与此https://github.com/moment/moment/issues/2035

相关的一些链接

日期和任何特定格式都没有问题,只有时间戳才有问题。

1 个答案:

答案 0 :(得分:1)

使用力矩(使用timezones moment.js)时,需要考虑偏移量。由于没有在输入中传递偏移量,因此该时刻将基于运行代码的计算机的时区,因此值也不同。

示例:

var a = moment.tz("2013-11-18 11:55", "Asia/Taipei");
var b = moment.tz("2013-11-18 11:55", "America/Toronto");

a.format(); // 2013-11-18T11:55:00+08:00
b.format(); // 2013-11-18T11:55:00-05:00

a.utc().format(); // 2013-11-18T03:55Z
b.utc().format(); // 2013-11-18T16:55Z

如果使用moment-timezone更改moment对象的时区,则只会影响本地时间的值。它不会更改表示的时间,因此也不会更改底层的时间戳。

Unix Timestamp总是 (基于UTC)-您可以在世界上任何给定位置将其视为相同的时间戳记。

编辑:

如果您使用utcOffset,则应传递一个整数:

示例:

moment.utc("2015-10-01 01:24:21").utcOffset("-240").format('YYYYMMDD HHmmss ZZ')
// "20151001 012421 +0000"

moment.utc("2015-10-01 01:24:21").utcOffset(-240).format('YYYYMMDD HHmmss ZZ')
// "20150930 212421 -0400"

MomentJS允许将偏移量参数作为字符串传递,但是它期望字符串采用ISO8601格式之一:[+/-]HH:mm[+/-]HHmm

要避免所有这些,如果知道的话,您可以将位置作为参数传递,例如

 moment.tz(start_time, "HH:mm:ss", "Asia/Kolkata").valueOf();

如上面第一个示例中所述。.