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

时间:2014-01-15 08:26:38

标签: datetime time timezone utc dst

这是一个类似于this one的问题。

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

====================================================================================
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中是否可行......)

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

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

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

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

提前感谢您的关注和帮助。

1 个答案:

答案 0 :(得分:4)

使用UTC时最常被忽视的情况是安排将来次 - 尤其是重复模式

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

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

我已发布在this many times before上。

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

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

关于你的具体要点:

  

如果我决定以UTC格式存储活动时间......将很难显示它们......

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

  

如果我决定以UTC格式存储活动时间......查询它们将非常困难(例如,如果我想要显示当地时间2014-01-15发生的所有事件,我需要为每个事件进行比较该事件的时间与'2014-01-15'在该事件的时区中意味着什么。不确定这在SQL中是否可行......)

这是事实。每个人的“今天”都不同。如果您需要将数据绑定到浮动的“日期”,那么这是另一种不以UTC格式存储的情况。但是,DateTimeOffset会为您提供两者的优势。

  

如果我决定将活动时间存储为当地时间...我将无法比较不同地点的活动时间(但这对我来说还可以)

不止于此。没有偏移的本地DateTime可能与daylight saving time fall-back transitions不明确。所以你可以有一个局部值,你无法区分它对应的两个时间点。

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