在没有 DST 的情况下将时间保存为 UTC(时刻)
Posted
技术标签:
【中文标题】在没有 DST 的情况下将时间保存为 UTC(时刻)【英文标题】:Saving time as UTC without DST (moment) 【发布时间】: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 时间所做的一切,因为这个问题可能会出现问题)。
谢谢
【问题讨论】:
【参考方案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 时间进行测试。
【讨论】:
以上是关于在没有 DST 的情况下将时间保存为 UTC(时刻)的主要内容,如果未能解决你的问题,请参考以下文章
Python:如何在不知道 DST 是不是生效的情况下将时区感知时间戳转换为 UTC
在 Windows XP/Server 2003 下将新旧本地时间转换为 UTC