【问题标题】:Converting ISO 8601 to Unix using moment.js, but the offset isn't being taken in to account使用 moment.js 将 ISO 8601 转换为 Unix,但未考虑偏移量
【发布时间】:2023-03-11 02:24:02
【问题描述】:

我已尽我所能阅读文档,但无法解决。

我有一个从 Bootstrap DateTime Picker 获取的日期/时间,它是一个 ISO 8601 字符串,如下所示:

2016-04-01T22:00:00+01:00

该字符串是在日期/时间选择器中选择 4 月 1 日晚上 10 点的结果。

我想将其转换为 unix 时间戳以存储在数据库中

当我使用时:

moment(date).format('X')

我得到以下 unix 时间戳:1459544400

这与2016-04-01T21:00:00+00:00 相关,比我选择的时间晚了 1 小时。无论我做什么,我似乎都无法获得 unix 时间戳来考虑偏移量。谁能帮助我并告诉我我在这里缺少什么?

非常感谢!

【问题讨论】:

  • 时刻正在做正确的事情。你期待什么结果?顺便说一句,这两个时间戳发生在同一时刻。一个比另一个晚一个小时。
  • 问题是,我正在使用这个时间戳来设置通知提醒。我得到的时间戳总是比用户使用日期/时间选择器输入的时间晚 1 小时——所以我的通知总是晚 1 小时。这是由 DST 引起的。我该如何解决?
  • 嗯,那个场景并不是你所说的问题的一部分,所以我建议你单独研究一下(关于这个主题已经有很多问题了)。如果您找不到所需的内容,请针对该特定问题提出一个新问题,并附上支持性细节。虽然没有看到任何细节,但我建议您考虑一下 unix 时间戳可能不一定是序列化和持久化这些数据的最合适的形式。 ISO8601 字符串可能会更好。如果不了解您的完整设置,很难说。
  • 如果您的方案主要是关于调度,请参阅this answer

标签: momentjs unix-timestamp iso8601


【解决方案1】:

一小时的差异是由于夏令时,根据定义,它不会反映在 Unix 时间戳中。

您可能需要考虑moment-timezone.js 来处理时间转换中的 DST。

【讨论】:

  • 第一部分是正确的。 UNIX 时间戳始终采用 UTC。 Moment-timezone 不会改变这一点。
【解决方案2】:

您可以在 javascript 中使用Date.parse()

const isoDate = new Date();
const convertToUnix = Date.parse(isoDate.toISOString());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-13
    • 2020-12-28
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多