Linux 上 mktime 的混淆行为?

标签 c linux mktime datetime

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

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

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

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

最佳答案

如果本地时间在夏令时变化 30 分钟,那么每年有 30 分钟的本地时间会发生两次(一次有夏令时,一次没有),另外 30 分钟从不 (当时间改变时它会被跳过)。

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

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

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

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

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

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

关于Linux 上 mktime 的混淆行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7446043/

相关文章:

linux - UART3 RX在TI Omap AM335x Sitara Variscite开发板上保持高电平(强上拉)

c - 总是检查 malloc 的内存?

c - Winsock 只接受来自同一台计算机的连接,但不接受来自同一网络的连接

linux - uc_mcontext 定义在哪里?

python - 运行 python3 manage.py migrate 时 Virtualenv(Pyt​​hon3.5/pip3/Django2.0/psycopg2) 出错

c++ - 奇怪的 mktime 行为 - 如果将返回值分配给变量则更改

c - 将 perror 与参数一起使用

使用C将十六进制字符串常量转换为十进制值

c - Difftime 一直返回 0

iphone - mktime(从 php)到 iphone 时间(字符串)