momentJS:从不同时区的日期获取错误的时间戳
momentJS: Getting wrong timestamp from date in a different timezone
输入一次即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_time 标记值在本地和服务器上是不同的。但是时间戳不应该随时区而改变,它应该对所有时区保持不变。请帮我解决这个问题。
如何在两个地方获得正确且相同的值。我得到了这个 link 一些与此相关的东西 https://github.com/moment/moment/issues/2035
任何特定格式的日期都没有问题,问题仅在于时间戳。
使用力矩(使用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
对象的时区,只会影响当地时间的值。它不会更改表示的时间,因此不会更改基础时间戳。
A 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();
如上面第一个示例中所述..
输入一次即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_time 标记值在本地和服务器上是不同的。但是时间戳不应该随时区而改变,它应该对所有时区保持不变。请帮我解决这个问题。
如何在两个地方获得正确且相同的值。我得到了这个 link 一些与此相关的东西 https://github.com/moment/moment/issues/2035
任何特定格式的日期都没有问题,问题仅在于时间戳。
使用力矩(使用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
对象的时区,只会影响当地时间的值。它不会更改表示的时间,因此不会更改基础时间戳。
A 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();
如上面第一个示例中所述..