3

我住在一个他们每年改变两次时间的国家。即:一年中有一段时间与UTC的偏移量为-3小时(-180分钟),而其他时间段的偏移量为-4小时(-240分钟)

形象地说:

       |------- (offset = -3) -------|------- (offset is -4) -------|
start of year                      mid                            end of year

我的问题是:
“时区”只是代表偏移量的数字?那就是:我的国家有两个时区?或时区包含此信息?

这很重要,因为我将每个日期都保存在我的数据库中的 UTC 时区(偏移量 = 0)中。

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

这是我通过使用时区 UTC 保存日期看到的一个问题示例:
假设我有一个人们发送消息的系统。
我想要一个统计部分,在其中绘制“发送的消息v / s小时”(即:“在常规日子按小时发送的消息”)

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

  1. 消息 1,于 3 月 1 日发送,UTC 时间下午 5 点(当地时间下午 2 点)
  2. 消息 2,于 8 月 1 日在 UTC 时间下午 5 点(当地时间下午 1 点)发送

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

4

3 回答 3

5

来自StackOverflow 上的标签 wiki :

时区 != 偏移量

时区不能仅由与 UTC 的偏移量表示。由于“夏令时”或“夏令时”规则,许多时区有不止一个偏移量。偏移量更改的日期也是时区规则的一部分,任何历史偏移量更改也是如此。许多软件程序、库和 Web 服务忽略了这一重要细节,并错误地将标准或当前偏移量称为“区域”。这可能会导致混乱和滥用数据。请尽可能使用正确的术语。

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

您的具体问题:

“时区”只是代表偏移量的数字?那就是:我的国家有两个时区?或时区包含此信息?

你有一个“时区”。它包括两个“偏移量”。

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

如果您正在记录事件发生或将要发生的精确时刻,那么您应该存储该特定时间的偏移量。在.NetSQL Server中,这使用DateTimeOffset. 其他平台也有类似的数据类型。它仅包含偏移信息 - 不包含偏移源自的时区。通常以ISO8601格式序列化,如:

2013-05-09T13:29:00-04:00

如果您可能需要编辑该时间,那么您不能只存储偏移量。在系统的某个地方,您还需要有时区标识符。否则,您无法确定编辑完成后的新偏移量。如果您愿意,可以将其与值本身一起存储。一些平台有专门用于此目的的对象 - 例如ZonedDateTimeNodaTime中。例子:

2013-05-09T13:29:00-04:00  America/New_York

即使在存储区域 id 时,您仍然需要记录偏移量。这是为了解决从日光偏移到标准偏移的“回退”过渡期间的歧义。

或者,您可以使用时区名称存储UTC时间:

2013-05-09T17:29:00Z  America/New_York

这也可以,但是您必须先应用时区,然后才能将值显示给任何人。 TIMESTAMP WITH TIME ZONEOraclePostgreSQL中以这种方式工作。

您可以在这篇文章中阅读更多相关信息,而 .Net 则专注于 - 这个想法也适用于其他平台。您给出的示例问题是我所说的“保持观察者的视角” - 在同一篇文章中进行了讨论。

于 2013-05-09T20:24:53.053 回答
2

that is: my country has two timezones? or the timezone includes this information?

The term "timezone" usually includes that information. For example, in Java, "TimeZone represents a time zone offset, and also figures out daylight savings" (link), and on Unix-like systems, the tz database contains DST information.

However, for a single timestamp, I think it's more common to give just a UTC offset than a complete time-zone identifier.

[…] in my database.

Naturally, you should consult your database's documentation, or at least indicate what database you're using, and what tools (e.g., what drivers, what languages) you're using to access it.

于 2013-05-09T17:08:13.247 回答
1

这是一个非常流行的描述时区格式的示例(尽管不是 Windows 使用的格式)。

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

于 2013-05-09T17:10:59.307 回答