Ric*_*ham 5 database-design datetime
显然,在大多数情况下,时间应该以 UTC 格式存储。在所有情况下,记录过去事件的日期时间都应以 UTC 格式存储。我们这样做是因为民间时间不断变化,而事件发生的时刻与当地政府认为的时间无关。
但是,当时间与日期分离时,当它们指的是挂钟时间时,我认为它们应该存储在挂钟时间中。
假设我有一个系统必须在特定时区的下午 3 点执行事件,我认为我最好将时间存储为下午 3 点。当事件重复发生并且应该总是在下午 3 点发生时更是如此——无论夏令时是否生效。如果它应该在本地下午 3 点对不同时区的多个用户发生,那么在 UTC 中存储任何内容似乎很愚蠢。
对我来说,这感觉很明显。但是我正在寻找可以支持我的可信赖来源的标准、规范或至少是博客文章。
总的来说,我同意你的评价。当在以下任何情况下要使用时间时,仅使用当地时间是合适的:
还有一些其他的上下文使时区变得明显或无关紧要。
由于某种原因,X 按固定时间间隔发生比 X 在特定时间发生更重要。
假设上述情况属实,那么我完全支持使用当地时间。您没有提到数据库平台,但如果您的数据库平台支持它,我认为与日期无关的事件应该存储在纯时间数据类型中,假设您的数据库平台支持/提供此数据类型。例如,在 SQL Server 中,我将使用Time数据类型来存储商店的营业时间。再次使用 SQL Server,我将使用该DateTime2数据类型来存储音乐会的日期和开始时间。
由于我们正在讨论这个主题,我个人会在服务器上使用 UTC 时间来处理不符合我上面概述的“仅限本地时间”参数的所有内容,就像您在问题中所述。许多数据库平台提供了与 SQL Server 类似的解决方案DateTimeOffset,但这并不是一个真正安全的解决方案,因为您最终会丢失实际时区信息而不是偏移量,并且偏移量会发生变化。有关此问题和其他时间相关问题的更详细概述(从 .NET 的角度来看),请查看Jon Skeet 撰写的这篇文章。