gpt4 book ai didi

c - time.h 中的 tzset 和 daylight 全局变量解释

转载 作者:太空狗 更新时间:2023-10-29 17:20:30 31 4
gpt4 key购买 nike

在日光全局变量的 time.h header 中,它说: “如果夏令时规则适用,则此变量具有非零值。非零值并不一定意味着夏令时现在有效;它仅意味着夏令时有时有效。”

现在我注意到在 Solaris 11.2 和 Linux 中,“daylight”变量都设置为 1,即使我的时区根本不使用夏令时(澳大利亚/布里斯类)。

示例代码证实了这一点,如果我运行 tzset 并输出我们得到的全局变量:日光 = 1 tz[0] = [AEST] tz[1] = [AEDT] 时区 = [-36000]

但据我了解,夏令时应设置为 0,因为我的区域在一年中的任何时间都没有夏令时。

我还注意到,当设置为当前时间时,struct tm 返回一个 tm_isdst = 0,这是正确的。

那么为什么日光变量设置为 1 呢?不应该设置为0吗?还是我误解了这个?

代码是:

#include <stdio.h>
#include <time.h>
void main()
{
time_t t;
struct tm *tms = { 0 };
tzset();
time(&t);
tms = localtime(&t);
printf("date and time : %s",ctime(&t));
printf("daylight = %d tz[0] = [%s] tz[1] = [%s] timezone = [%ld]\n", daylight, tzname[0], tzname[1], timezone);
printf("tm_isdst = %d\n",tms->tm_isdst);
}

输出是:

date and time : Mon Nov 30 16:41:01 2015
daylight = 1 tz[0] = [AEST] tz[1] = [AEDT] timezone = [-36000]
tm_isdst = 0

最佳答案

关于 C 标准 tm_isdst 成员。

The value of tm_isdst is positive if Daylight Saving Time is in effect, zero if Daylight Saving Time is not in effect, and negative if the information is not available. C11dr §7.27.1 4

这与关于 *nix 全局变量 daylight 的 *nix 规范略有不同。
daylight 不是标准 C 的一部分。


gnu.org报告

Variable: int daylight
This variable has a nonzero value if Daylight Saving Time rules apply. A nonzero value does not necessarily mean that Daylight Saving Time is now in effect; it means only that Daylight Saving Time is sometimes in effect.


tm_isdst 指的是struct tm 时间戳。它只表示 DST对该时间戳有效。

daylight != 0 表示有时在时区的时间戳中使用 DST。

由于澳大利亚/布里斯类曾经在 1972 年之前 ( @Jon Skeet ) 观察到夏令时,所以 daylight == 1 是合理的,因为 daylight 暗示 DST 在某些时期有效该时区的时间(可能自 1970 年以来)。

OP 的“...即使我的时区根本不使用夏令时”也不正确。


以下代码显示自 1970 年以来在“澳大利亚/布里斯类”使用了 DST(至少 timezone DB 这么认为)多年。

#include<time.h>
#include<stdlib.h>
#include<sys/time.h>

int main(void) {
setenv("TZ", "Australia/Brisbane", 1);
tzset();
time_t now;
time(&now);
struct tm tm;
int isdst = 42; // See Hitchhiker's_Guide_to_the_Galaxy
time_t t;
for (t = 0; t < now; t += 3600) {
tm = *localtime(&t);
if (tm.tm_isdst != isdst) {
printf("dst:%d %s", tm.tm_isdst, ctime(&t));
isdst = tm.tm_isdst;
}
}
printf("dst:%d %s", tm.tm_isdst, ctime(&t));
return 0;
}

输出

dst:0 Thu Jan  1 10:00:00 1970
dst:1 Sun Oct 31 03:00:00 1971
dst:0 Sun Feb 27 02:00:00 1972
dst:1 Sun Oct 29 03:00:00 1989
dst:0 Sun Mar 4 02:00:00 1990
dst:1 Sun Oct 28 03:00:00 1990
dst:0 Sun Mar 3 02:00:00 1991
dst:1 Sun Oct 27 03:00:00 1991
dst:0 Sun Mar 1 02:00:00 1992
dst:0 Tue Dec 1 16:00:00 2015

关于c - time.h 中的 tzset 和 daylight 全局变量解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33992832/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com