我住在一个他们一年两次改变时间的国家。那就是:一年中有一段时间,它与UTC的偏差是-3小时(-180分钟),而其他时期偏移是-4小时(-240分钟)
Grafically:
|------- (offset = -3) -------|------- (offset is -4) -------|
start of year mid end of year
我的问题是:
“timezone”只是代表偏移量的数字?那是:我的国家有两个时区?或时区包含此信息?
这很重要,因为我在我的数据库中以UTC时区(offset = 0)保存每个日期。
相反,我是否应该使用本地时区保存日期并保存其偏移量(保存时)?
以下是我通过使用时区UTC保存日期时遇到的问题示例:
假设我有一个人们发送消息的系统
我想要一个统计部分,我在其中绘制“以v / s小时发送的消息”(即:“按常规日内按小时发送的消息”)
假设整个数据库中只有两条消息:
然后,如果我在8月2日创建情节,将这些UTC日期转换为本地会给我:“2条消息在下午1点发送”,这是不稳定的信息!
答案 0 :(得分:4)
来自timezone代码wiki here on StackOverflow:
TimeZone!=偏移
时区不能仅由UTC的偏移量表示。许多 由于“夏令时”或时区,时区有多个偏移 “夏令时”规则。抵消变化的日期也是其中的一部分 时区的规则,以及任何历史偏移变化。 许多软件程序,库和Web服务都忽视了这一点 重要细节,并错误地调用标准或当前偏移量 “区域”。这可能导致混淆和滥用数据。请 尽可能使用正确的术语。
有两个常用的数据库,Microsoft Windows时区db和IANA / Olson时区db。有关详细信息,请参阅the wiki。
您的具体问题:
“timezone”只是表示偏移的数字?那是:我的国家有两个时区?或者时区包含这些信息?
你有一个“时区”。它包括两个“抵消”。
相反,我是否应该使用本地时区保存日期并保存其偏移量(保存时)?
如果您正在记录事件发生或将要发生的确切时刻,那么您应该使用它存储该特定时间的偏移量。在.Net和SQL Server中,使用DateTimeOffset
表示。其他平台中有类似的数据类型。它仅包含偏移信息 - 而不是偏移源自的时区。通常,它以ISO8601格式序列化,例如:
2013-05-09T13:29:00-04:00
如果您可能需要编辑那段时间,那么您不能只存储偏移量。在系统的某个位置,您还需要具有时区标识符。否则,您无法确定编辑后新偏移量应该是多少。如果您愿意,可以使用值本身存储它。某些平台具有完全出于此目的的对象 - 例如NodaTime中的ZonedDateTime
。例如:
2013-05-09T13:29:00-04:00 America/New_York
即使存储区域ID,您仍需要记录偏移量。这是为了解决从日光偏移到标准偏移的“后退”过渡期间的模糊性。
或者,您可以使用时区名称将时间存储在
2013-05-09T17:29:00Z America/New_York
这也可以,但您必须在向任何人显示值之前应用时区。 Oracle和PostgreSQL中的TIMESTAMP WITH TIME ZONE
以这种方式工作。
您可以在this post中了解更多相关内容,而.Net专注 - 这个想法也适用于其他平台。您给出的示例问题是我称之为“维护观察者的透视” - 这在同一篇文章中讨论过。
答案 1 :(得分:2)
那是:我的国家有两个时区?或者时区包含这些信息?
术语“时区”通常包括该信息。例如,在Java中,“TimeZone
表示时区偏移,并且还计算出夏令时”(link),而在类Unix系统上,the tz
database包含DST信息。 / p>
但是,对于单个时间戳,我认为仅提供UTC偏移量比完整的时区标识符更常见。
[...]在我的数据库中。
当然,您应该查阅数据库的文档,或者至少说明您正在使用的数据库,以及您用来访问它的工具(例如,驱动程序,语言)。
答案 2 :(得分:1)
以下an example very popular format用于描述时区(虽然不是Windows使用的)。
你可以看到它不仅仅是一个简单的偏移。更多关于偏移和一组规则(随时间变化)以确定何时使用哪个偏移量。