gpt4 book ai didi

c - 在 Linux 下使用 gcc 在 C 中使用夏令时和 mktime

转载 作者:行者123 更新时间:2023-12-04 21:15:48 24 4
gpt4 key购买 nike

我正在检测夏令时(夏令时)转换。我遇到了一些我不明白的事情,希望得到一些解释。

我已将我的代码精简到几乎最低限度以显示问题。

int main(void)
{
struct tm tm1,tm2;
time_t time1, time2;
int order=0;//change this betwee 0 and 1

tm1.tm_hour=2;
if (order)
{
tm1.tm_hour=1;
}
tm1.tm_min=0;
tm1.tm_sec=0;
tm1.tm_mday=1;
tm1.tm_mon=10;
tm1.tm_year=115;
tm1.tm_isdst=-1;
time1=mktime(&tm1);

//insert here

tm2.tm_hour=1;
if (order)
{
tm2.tm_hour=2;
}
tm2.tm_min=0;
tm2.tm_sec=0;
tm2.tm_mday=1;
tm2.tm_mon=10;
tm2.tm_year=115;
tm2.tm_isdst=-1;
time2=mktime(&tm2);


printf("\n\n time stamp 1=%zu time stamp 2=%zu difference=%zi\n\n",time1 ,time2, time2-time1);
exit(0);
}

order = 0 时的输出是:

time stamp 1=1446368400 time stamp 2=1446364800 difference=-3600

order = 1 时的输出是:

time stamp 1=1446361200 time stamp 2=1446368400 difference=7200

(请注意,这是故意设置夏令时结束时间,2015 年 11 月 1 日 01:59:59 后一秒为 01:00:00。)

简单来说,hour = 2 时结构体的转换取决于紧接在它之前发生的转换。一点可以(正确地)是 1446364800(标准时间)或 1446361200(DST)。如果发现之前的转换为 DST,则使用第二个选择,反之亦然。显而易见的解决方案是 mktime 设置一些变量,它在下一次使用。但是我找不到它的任何记录。 mktime 确实设置了三个(四个?)外部变量,tzname[0]、tzname[1]、timezone 和 daylight,但这些似乎并没有造成影响。 (我做了一个更复杂的测试程序版本来测试它。)

我的时区是美国/埃德蒙顿 ( MST(UTC-7)/MDT(UTC -6) )

$ gcc --version<br>
gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4

Kubuntu 14.04 长期支持版

任何见解或指示将不胜感激。

编辑:回复评论:1) 乔纳森——glibc 2.19 版2) chux——在 mktime() 之后打印 tmX.tm_isdst、tmX.tm_hour 的值并没有给我任何洞察力。 (那是因为我是盲人吗?)一点钟转换显示一小时和 is_dst 为 0 或 1,与时间戳推断的完全相同。当然,两点钟转换显示小时为 2,is_dst 为 0。

回复 chux 的(?) 回答: 不知是不是我自己没有完全解释清楚。我意识到这是怎么回事:有歧义,它必须“猜测”。我想知道的是为什么(以及如何)猜测取决于之前的转换?

第二次编辑:

为了确认 Wumpus Q. Wumbley 的回答,在上面代码指示的地方插入了以下代码:

tm0.tm_hour=0;
tm0.tm_min=0;
tm0.tm_sec=0;
tm0.tm_mday=1;
tm0.tm_mon=10;
tm0.tm_year=115;
tm0.tm_isdst=-1;
time0=mktime(&tm0);

(基本上是一次性转换)现在,无论顺序如何,我都会得到两个小时的差异,所以无论哪种方式,我都会得到 DST 版本。

感谢您的解释。

最佳答案

在当前的 glibc 源代码中,位于 time/mktime.c line 410有相关评论:

/* Invert CONVERT by probing.  First assume the same offset as last
time. */

它有意在可能的情况下在连续调用中使用相同的偏移量。没有全局变量可以设置来更改它,或者检查以检测它。它保存在第 578 行的 static time_t localtime_offset; 中。

关于c - 在 Linux 下使用 gcc 在 C 中使用夏令时和 mktime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32058873/

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