如何使用moment.js获取两个不同时区中同一日期的Unix时间戳?

问题描述

我正在开发一个应用程序,用户可以在其中选择记录时间的时区。但是在内部,我想将时间存储为unix时间戳。

说我有个日期“ 2016-01-01 1:00 pm”。如果我将这个日期存储在CDT(美国/芝加哥)中,则我的理解是,生成的unix时间戳应该与我将相同的日期存储在MDT(美国/丹佛)中的日期不同。但是,我在两个日期上都获得了相同的unix时间戳,并且无法理解原因。

var chicagoDate = moment('2016-01-01 1:00 pm').tz('America/Chicago');
var denverDate = moment('2016-01-01 1:00 pm').tz('America/Denver');

chicagoDate.format();
// "2016-01-01T07:00:00-06:00"
denverDate.format();
// "2016-01-01T06:00:00-07:00"

到目前为止,这可以确认两个日期彼此不同,如使用format()获得的UTC表示所示。但是,这是我感到困惑的地方:

chicagoDate.unix();
// 1451653200
denverDate.unix();
// 1451653200

2个不同的UTC日期是否会导致2个不同的unix时间戳吗?

解决方法

在:

<table style="width: 100%;">
  <thead>
    <tr>
      <th>Source</th>
      <th>Url</th>
      <th>Referenceid</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td title="12345">12345</td>
      <td class="td" title="https://example1.com"><a href="#">https://example1.com</a></td>
      <td title="2">2</td>
    </tr>
    <tr>
      <td title="12345">12345</td>
      <td class="td" title="https://example2.com"><a href="#">https://example2.com</a></td>
      <td title="1">1</td>
    </tr>
  </tbody>
</table>

没有解析格式参数,因此moment.js会查看该格式是否是可以在没有格式的情况下解析的格式。不能,所以它会退回到内置的解析器,就像您编写的一样:

moment('2016-01-01 1:00 pm').tz('America/Chicago');

并在控制台中发出警告:

弃用警告:提供的值不是公认的RFC2822或ISO格式。此刻的构建工作归结为js Date(),它在所有浏览器和版本中都不可靠……

Safari至少将其解析为无效日期(时间戳),因此您应包括解析格式:

moment(new Date('2016-01-01 1:00 pm')).tz('America/Chicago');

第二,由于没有与时间戳相关联的时区,因此将字符串解析为本地字符串。因此,两行代码产生的时间值完全相同(即从纪元偏移),并且产生的两个日期实际上是相同的。

tz 的调用设置了用于所有后续操作的时区,因此输出显示了不同的时间,因为在格式化阶段已应用了不同的偏移量。实际格式化的日期仍然有效。

如果您希望将字符串解析为另一个时区,则需要在解析阶段将其手动包含在字符串中(例如'-06:00'或其他),或使用类似{{3 }},并拥有IANA位置(例如“美国/芝加哥”)。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...