为什么mktime()需要知道夏令时?

And*_*eas 2 c datetime

因此mktime()返回一个time_t值,该值定义为"表示自UTC时间1970年1月1日00:00起经过的秒数的整数值"(来源).我可以使用将日期转换为time_tmktime().例如,要将日期10-Sep-2017 08:34:56转换为time_t我要执行以下操作:

struct tm tm;
time_t tv;

tm.tm_sec = 56;
tm.tm_min = 34;
tm.tm_hour = 8;
tm.tm_mday = 10;
tm.tm_mon = 8;
tm.tm_year = 117;
tm.tm_isdst = ????;

tv = mktime(&tm);
Run Code Online (Sandbox Code Playgroud)

现在我不明白的是tm_isdst参数背后的想法:它被描述为"一个标志,指示夏令时是否在所描述的时间生效"(来源).

这个描述有点令我感到困惑,因为我认为我所描述的时间struct tm实际上已经是UTC时间,time_t我想要的价值mktime()也是UTC.但是UTC时间不会随着季节的变化而变化,那么为什么mktime()需要费心去节省夏令时呢?使用UTC而不是本地时间的优势不是我不必为夏令时烦恼吗?那么我为什么要设置tm_isdst呢?

我确定答案很简单,但目前我没有看到它.有人可以提供一个简单的例子,说明为什么mktime()需要tm_isdst参数将某个日期和时间转换为time_t值?

dbu*_*ush 6

DST是否有效地改变了纪元时间,因为mktime使用当前时区来确定时间.

例如,如果我填充tm1/1/70 00:00:00,如下所示:

tm.tm_sec = 0;
tm.tm_min = 0;
tm.tm_hour = 0;
tm.tm_mday = 1;
tm.tm_mon = 0;
tm.tm_year = 70;
tm.tm_isdst = 0;
Run Code Online (Sandbox Code Playgroud)

我的值为18000 tv因为我的时区是GMT-5(18000 = 3600*5).如果我将值更改tm_isdst为1,tv则将设置为14400(3600*4).

设置tm_isdst为-1将查看本地时区数据库,以查看DST是否对给定的日期/时间有效.