【问题标题】:moment-timezone: unix timestamps with timezonesmoment-timezone:带有时区的 unix 时间戳
【发布时间】:2016-08-26 20:11:51
【问题描述】:

我正在将 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 时间真的允许时区吗?

标签: node.js unix timestamp momentjs


【解决方案1】:

Unix Timestamp始终基于 UTC。它同时在地球上的任何地方都使用相同的时间戳。

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

【讨论】:

  • 如何获取特定时区中特定日期时间的绝对时间戳?
【解决方案2】:

为了向用户显示不同时区的正确时间,我们可以将时区偏移量添加到 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')

【讨论】:

  • 加法或减法几乎从来都不是应用 UTC 偏移量的正确方法。您不是在调整时区,而是在选择不同的时间点。
  • 是的,事实是周围的世界并不是在同一时间。这是向机器以外的人类展示选定时区的时间的唯一方法。我们可以将 UTC 存储在服务器上,但在网站上,我们必须显示正确的时间。
  • 抱歉,这不是真的。如果我让世界各地的三个人同时准确地拍手,我们都可以同意该事件同时发生(不涉及时钟准确性或相对论论点)。这就是“瞬间”或“瞬间”或“时间点”的含义。可以表示为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 - by definition.
  • 添加(比如一个小时)会给出不同的时间点:14722417311472241731000"2016-08-26T21:02:11Z""2016-08-26T23:02:11+02:00""2016-08-26T14:02:11-07:00"。跨度>
  • 我们用太阳的位置测量时钟时间,这就是为什么我们在登陆任何新国家时手动更改时钟时间。如果我们仍然手动执行,我们必须手动将偏移量添加到时间以获取当前时区的实际时间。如果我们在 UNIX 时间戳中节省时间(人类不可读)。我们必须添加偏移量并对其进行格式化以使其对人类可读。我只是在谈论可用性。
猜你喜欢
  • 2014-08-15
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 2016-12-06
  • 2012-09-17
  • 2012-05-06
  • 2017-04-25
  • 1970-01-01
相关资源
最近更新 更多