moment-timezone: 带时区的Unix时间戳

4
我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我正在使用momentjs.com和nodejs,并尝试获取多个时区的Unix时间戳,但很遗憾输出结果不正确。

代码:

var moment = require('moment-timezone');

var berlin = moment.tz('Europe/Berlin').unix();
var angeles = moment.tz('America/Los_Angeles').unix();
var london = moment.tz('Europe/London').unix();

console.log(berlin);
console.log(angeles);
console.log(london);

输出:

1472241731
1472241731
1472241731

Unix时间戳真的允许时区吗? - Charlie Fish
3个回答

17

一个Unix 时间戳始终基于协调世界时(UTC)。无论在地球上的哪个位置,时间戳始终相同。

使用 moment-timezone 更改 moment 对象的时区只会影响本地时间值,例如与 format 函数(和其他函数)一起使用。它不会改变所表示的时间瞬间,因此也不会更改底层时间戳。


1
如何在特定时区获取特定日期时间的绝对时间戳? - lazzy_ms
那么它就不是绝对的了吧?Unix时间戳始终处于UTC时区。然后,您需要创建一个Datetime对象并将其时区设置为您想要的任何时区。 - radalin

0

你可以使用 Date.parse 来获取时间戳,像这样

const moment = require("moment-timezone")

const time = '2022-09-02 04:06:25'
var a = new Date(time).valueOf()                            
var b = Date.parse(moment.tz(time, "America/Chicago").format())

console.log(a)   // China 1662062785000  
console.log(b) // Chicago 1662109585000

-3
为了向用户展示不同时区的正确时间,我们可以将时区偏移量加到Unix UTC时间戳中。
const convertToNewTimeZone = (timeInMilliseconds: number, timezone: string) => {
  const utcOffset = moment.tz(timeInMilliseconds, timezone).utcOffset();
  return moment(timeInMilliseconds)
    .add(utcOffset, 'minutes');
};

请注意,如果您正在浏览器中计算时间,则可能需要减去浏览器时区偏移量。
newTime.clone().subtract(moment().utcOffset(), 'minutes')

1
加减法几乎从来不是应用UTC偏移的正确方式。你不是在调整时区,而是在选择不同的时间点。 - Matt Johnson-Pint
是的,事实上,世界各地的时间并不同时。这是向人类展示选择时区的时间的唯一方式,而不是机器。我们可以在服务器上存储UTC,但在网站上,我们必须显示正确的时间。 - Umer Bhat
抱歉,但那不是真的。如果我让世界上三个人同时鼓掌,我们都可以同意这个事件是同时发生的(不涉及时钟精度或相对论争议)。这就是所谓的“瞬间”或“时间点”。它可以表示为14722417311472241731000"2016-08-26T20:02:11Z""2016-08-26T22:02:11+02:00""2016-08-26T21:02:11+01:00""2016-08-26T13:02:11-07:00",但前两者的具体含义始终是UTC-根据定义 - Matt Johnson-Pint
加上一个小时后得到不同的时间点:14722417311472241731000"2016-08-26T21:02:11Z""2016-08-26T23:02:11+02:00""2016-08-26T14:02:11-07:00" - Matt Johnson-Pint
我们用太阳位置来测量时钟时间,这就是为什么我们在降落到任何新国家时手动更改时钟时间的原因。如果我们仍然手动更改,我们必须手动添加偏移量以获取当前时区的实际时间。如果我们正在保存UNIX时间戳(不可读取给人类),我们必须添加偏移并格式化它以使其对人类可读。我只是从可用性的角度谈论。 - Umer Bhat
啊,但是手动调整机械手表和设置智能手机上的时间之间有很大的区别。前者只有一个测量基准,即当地的“墙上时间”。后者具有内部基于UTC的时钟、对时区的理解以及本地墙上时间的外部表示。在智能设备上更改时区只会改变墙上时间的计算方式,而不会改变内部时钟的操作。Unix时间戳始终是内部基于UTC的时钟的表示,而不是本地墙上时间的表示。 - Matt Johnson-Pint

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接