未来的时间应该存储在 UTC 还是本地时间?

Ric*_*ham 5 database-design datetime

显然,在大多数情况下,时间应该以 UTC 格式存储。在所有情况下,记录过去事件的日期时间都应以 UTC 格式存储。我们这样做是因为民间时间不断变化,而事件发生的时刻与当地政府认为的时间无关。

但是,当时间与日期分离时,当它们指的是挂钟时间时,我认为它们应该存储在挂钟时间中。

假设我有一个系统必须在特定时区的下午 3 点执行事件,我认为我最好将时间存储为下午 3 点。当事件重复发生并且应该总是在下午 3 点发生时更是如此——无论夏令时是否生效。如果它应该在本地下午 3 点对不同时区的多个用户发生,那么在 UTC 中存储任何内容似乎很愚蠢。

对我来说,这感觉很明显。但是我正在寻找可以支持我的可信赖来源的标准、规范或至少是博客文章。

Eri*_*rik 4

总的来说,我同意你的评价。当在以下任何情况下要使用时间时,仅使用当地时间是合适的:

  1. 还有一些其他的上下文使时区变得明显或无关紧要。

    • 该时间仅用于参考音乐会等当地活动。因为我知道音乐会在 X 场馆举行,所以如果时间不在 X 场馆的时区,就会很奇怪。同样,如果我的医生的预约是根据与 X 场馆所在地不同的时区进行的,也会很奇怪。那次约会。
    • 我不必设置时区就能让手机闹钟在早上 6 点响起。我应该可以说早上 6 点,手机应该在当地时间每天早上 6 点叫醒我。请注意,我只是在谈论基本闹钟,就像时钟收音机一样。我不是在谈论与不同时区的人安排会议/约会。
  2. 由于某种原因,X 按固定时间间隔发生比 X 在特定时间发生更重要。

    • 有些事情需要每天发生一次,何时发生并不重要。通常您希望在非高峰时段执行一些计划任务,但可以想象这并不总是重要的。

假设上述情况属实,那么我完全支持使用当地时间。您没有提到数据库平台,但如果您的数据库平台支持它,我认为与日期无关的事件应该存储在纯时间数据类型中,假设您的数据库平台支持/提供此数据类型。例如,在 SQL Server 中,我将使用Time数据类型来存储商店的营业时间。再次使用 SQL Server,我将使用该DateTime2数据类型来存储音乐会的日期和开始时间。


由于我们正在讨论这个主题,我个人会在服务器上使用 UTC 时间来处理不符合我上面概述的“仅限本地时间”参数的所有内容,就像您在问题中所述。许多数据库平台提供了与 SQL Server 类似的解决方案DateTimeOffset,但这并不是一个真正安全的解决方案,因为您最终会丢失实际时区信息而不是偏移量,并且偏移量会发生变化。有关此问题和其他时间相关问题的更详细概述(从 .NET 的角度来看),请查看Jon Skeet 撰写的这篇文章。