5

我在 Suse 10 中使用 mktime(struct tm*) 函数。

现在,我注意到启用夏令时时出现一些奇怪的行为。假设我已启用夏令时,从 9 月 15 日 18:10 开始,日光校正时间为 30 分钟。现在,当我使用日期为 Sep 15 18:10 的 tm 结构调用 mktime 并且 tm_isdst 设置为 0 时,我仅在 tm_isdst 设置为 1 的情况下返回 tm 结构中的相同值。

但是,如果通过日期为 9 月 15 日 18:10 并将 tm_isdst 设置为 1,那么我发现时间更改为 17:40。在 9 月 15 日 18:10 到 9 月 15 日 18:40 之间经过的时间会注意到 tm 结构中的这种更正,但之后不会发生时间更正,并且 dst 标志保持启用状态。即使我将日期传递为 9 月 16 日 18:10,也不会发生时间校正,只有 dst 标志保持启用状态。

我完全糊涂了。这是 mktime 的正确行为吗?

4

2 回答 2

7

如果 DST 的当地时间改变了 30 分钟,那么每年一次有 30 分钟的当地时间发生两次(一次有 DST,一次没有),另外 30 分钟永远不会发生(当时间改变时它会被跳过)。

因此,除非指定了 DST 是否生效,否则时钟调回后 30 分钟内的当地时间是不明确的;他们可以对应两个实际的时间瞬间。

时钟提前30分钟内的当地时间无效;没有它们可以对应的实际时刻(尽管仍然可以通过假设 DST 有效或无效来完成转换)。

因此,对于某些本地时间(忽略 DST 状态),可能有多个对应的 UTC 时间,但对于任何给定的 UTC 时间,只有一个可能的本地时间(如果正确考虑 DST 调整)。

当您调用 时mktime,它会将您给它的本地时间转换为 time_t ,就好像 DST 是否有效一样,具体取决于tm_isdst. 您返回的更正值基于此转换的逆过程,系统将根据转换时 DST 是否有效的想法来确定您获得的是 DST 时间还是非 DST 时间。你给它的时间和你回来的时间实际上代表了同一个时间点,但由于不同的 DST 状态,与 UTC 的偏移量不同。

所以是的,这是正确的行为mktime。它应该根据如何正确表示您给它的时间的想法来规范化结构中的值。

这也说明了为什么在使用本地时间跟踪实际事件时应该小心——如果 DST 状态或与 UTC 的偏移量没有与时间一起保存,则某些本地时间值可能是不明确的。

于 2011-09-24T20:22:32.893 回答
0

查看这个答案,看看是否有帮助。另外,系统时区偏移量是多少?通过运行检查:

date +%z
于 2011-09-16T14:39:36.823 回答