什么时候可以将日期时间存储为本地时间而不是UTC?

When is it ok to store datetimes as local time rathen than UTC?

这是一个与此类似的问题。

我真的很想在我的应用程序中将日期时间存储为本地时间而不是UTC(这被认为是最佳实践)。在应用程序中,我发生了许多事件,每个事件都分配到给定的位置。总是当我向用户显示它们时,我想显示事件的当地时间。即:

1
2
3
4
5
6
7
====================================================================================
Event time (with TZ)   | As UTC           | As local time    | To be displayed  |
====================================================================================
2014-01-15 22:30 GMT   | 2014-01-15 22:30 | 2014-01-15 22:30 | 2014-01-15 22:30 |
2014-01-15 23:30 GMT+1 | 2014-01-15 22:30 | 2014-01-15 23:30 | 2014-01-15 23:30 |
2014-01-16 00:30 GMT+2 | 2014-01-15 22:30 | 2014-01-16 00:30 | 2014-01-16 00:30 |
====================================================================================

如果我决定以UTC格式存储事件时间:

  • 显示它们将很困难(因为每次事件我需要拥有事件的时区并格式化该时区的日期)。

  • 查询它们将非常困难(例如,如果我想要显示2014-01-15当地时间发生的所有事件,我需要为每个事件将该事件的时间与'2014-01-15'在该事件中的含义进行比较时区。不确定这在SQL中是否可行......)

如果我决定将活动时间存储为当地时间:

  • 我将无法比较不同地点的活动时间(但这对我来说还可以)

因为在应用程序的绝大多数情况下我对当地时间感兴趣(通常显示所谓的"电视时间")并且我创建新的日期时间对象的情况并不多(我需要它)位置时区),我认为在这种情况下保存日期时间是合理的。

你觉得它是吗?存储当地时间的其他缺点是什么?

在此先感谢您的关注和帮助。


最常被忽视的情况是何时不使用UTC是为了安排未来时间 - 特别是在重复模式中。

想象一下,如果您的闹钟是由UTC安排的。假设你每天早上7点设置它。在DST过渡后的第二天,您要么在早上6:00或早上8:00醒来,具体取决于转换的方向。

此外,我们确定时区偏移和夏令时变化的规则始终更新!因此,您不能将未来的本地时间转换为UTC,而不保留本地时间本身。否则,当事情发生变化时,你将无法获得真实的真相来源,而且所有的时间都会消失。

我之前发过很多次这个帖子。

当然,一旦事件发生,那么您当然希望以UTC或使用DateTimeOffset记录时间。

另一个常见的用例是没有时间的日期,特别是出生日期和其他周年日。这些应始终只存储为年,月,日(例如在大多数数据库中的date字段类型中) - 时区或UTC之间没有转换。

关于你的具体要点:

If I decide to store the event times in UTC ... it will be difficult to display them...

实际上这很容易。几乎每个编程环境都可以轻松完成。唯一困难的地方是JavaScript用于非本地时区,并且有库可以应对这种情况。

If I decide to store the event times in UTC ... it will be very difficult to query them (i.e. if I want to show all events that happened on 2014-01-15 local time I need for each event to compare that event's time with what '2014-01-15' means in that event's timezone. Not sure if this is even possible in SQL...)

那是真实的。每个人的"今天"都不同。如果您需要将数据绑定到浮动的"日期",那么这是另一种不以UTC格式存储的情况。但是,DateTimeOffset会给你两者带来的好处。

If I decide to store the event times as local times ... I will not be able to compare times of events for different locations (but this is ok for me)

它不止于此。没有偏移的本地DateTime可能对夏令时回落转换不明确。所以你可以有一个局部值,你无法区分它对应的两个时间点中的哪一个。

关于"电视时间" - 保留那些真正"漂浮"的东西的概念。示例:一家公司在世界各地都设有办事处,所有办事处均在上午8:00开始。这是一个浮动时间。