时区只是一个偏移数字还是“更多信息”?

时间:2013-05-09 17:01:59

标签: timezone utc timezone-offset

我住在一个他们一年两次改变时间的国家。那就是:一年中有一段时间,它与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小时发送的消息”(即:“按常规日内按小时发送的消息”)

假设整个数据库中只有两条消息:

  1. 消息1,3月1日发送,UTC时间下午5点(当地时间下午2点)
  2. 消息2,于8月1日发送,UTC时间下午5点(当地时间下午1点)
  3. 然后,如果我在8月2日创建情节,将这些UTC日期转换为本地会给我:“2条消息在下午1点发送”,这是不稳定的信息!

3 个答案:

答案 0 :(得分:4)

来自代码wiki here on StackOverflow

  

TimeZone!=偏移

     

时区不能仅由UTC的偏移量表示。许多   由于“夏令时”或时区,时区有多个偏移   “夏令时”规则。抵消变化的日期也是其中的一部分   时区的规则,以及任何历史偏移变化。   许多软件程序,库和Web服务都忽视了这一点   重要细节,并错误地调用标准或当前偏移量   “区域”。这可能导致混淆和滥用数据。请   尽可能使用正确的术语。

有两个常用的数据库,Microsoft Windows时区db和IANA / Olson时区db。有关详细信息,请参阅the wiki

您的具体问题:

  

“timezone”只是表示偏移的数字?那是:我的国家有两个时区?或者时区包含这些信息?

你有一个“时区”。它包括两个“抵消”。

  

相反,我是否应该使用本地时区保存日期并保存其偏移量(保存时)?

如果您正在记录事件发生或将要发生的确切时刻,那么您应该使用它存储该特定时间的偏移量。在.NetSQL 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

这也可以,但您必须在向任何人显示值之前应用时区。 OraclePostgreSQL中的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使用的)。

你可以看到它不仅仅是一个简单的偏移。更多关于偏移和一组规则(随时间变化)以确定何时使用哪个偏移量。