【问题标题】:Saving time as UTC without DST (moment)在没有 DST 的情况下将时间保存为 UTC(时刻)
【发布时间】:2020-02-25 18:54:25
【问题描述】:

我在尝试找出以 UTC 格式在数据库中存储时间和处理 DST 更改的逻辑时遇到问题。

我在数据库中有 TimeStart 和 TimeEnd 表示营业时间。如果我在 DST 和不是 DST 时节省了几个小时,就会出现问题。如果我在 10 月 15 日保存 09:00 - 17:00,结果会是 07:00 - 15:00 (UTC) 但如果我现在添加营业时间这不是 DST,它会导致 08:00 - 16:00 (UTC)。我认为当考虑到 DST 时,将时刻转换为 UTC 会给出一致的结果,但我错了。

在前端/后端处理该问题的最佳解决方案是什么。我应该减去添加的 DST 时间吗?因为使用时刻来处理转换为 UTC 并没有帮助,因为它无论如何都会产生 1 小时的差异(现在我质疑我迄今为止对 UTC 时间所做的一切,因为这个问题可能会出现问题)。

谢谢

【问题讨论】:

    标签: datetime momentjs dst


    【解决方案1】:

    由于我没有必要的声誉来简单地发表评论,我想我会写一个实际的答案。 (免责声明:我实际上并没有使用 moment.js)

    我建议您始终在数据库中将时间存储为 UTC。在前端显示/存储时应该发生转换。

    有关如何处理 DST 的更多信息,我发现这个很好的问题有很多答案。您应该能够将其中提到的许多内容应用于任何堆栈: Daylight saving time and time zone best practices

    鉴于问题中的详细信息,很难告诉您错误在哪里,您仍然得到错误的值。

    【讨论】:

    • 谢谢,我一直在我的数据库中将时间存储为 UTC,但我觉得 DST 总是存在这个问题。我的确切问题是,如果用户在 DST 时以 UTC 存储营业时间,这将导致在数据库中保存 07:00(UTC)(因为我在 +2 区域)。但是,如果用户现在添加营业时间,则没有 DST,它将导致数据库中的 08:00(作为 UTC)。存在这种不一致...我正在使用 moment(date).utc() 从本地转换为 UTC。
    • 哦。我知道了。我想在这里存储业务的位置(时区)是相关的。
    【解决方案2】:

    “始终使用 UTC”的建议是短视的。 使用 UTC 的情况有很多,您所描述的肯定是其中之一。事实是,UTC 不适合未来的调度 - 尤其是重复模式。

    只需存储营业时间的本地开始和结束时间,无需日期。您可能还想存储该商家所在位置的时区标识符(例如 "America/Los_Angeles")。

    在确定特定日期的营业时间时,将数据库中的时间应用到公司时区中的日期。要了解业务是否开放,请将 结果 转换为 UTC 以针对当前 UTC 时间进行测试。

    【讨论】:

      猜你喜欢
      • 2018-06-27
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多