1

有一个时间输入,即 start_time

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

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

任何特定格式的日期都没有问题,问题仅在于时间戳。

4

1 回答 1

1

使用 moment 时需要考虑偏移量(使用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使用 moment-timezone 更改对象的时区,则只会影响本地时间的值。它不会更改所表示的时间点,因此不会更改基础时间戳。

Unix 时间戳始终基于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();

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

于 2019-04-24T12:19:00.840 回答