因此mktime()
返回一个time_t
值,该值定义为"表示自UTC时间1970年1月1日00:00起经过的秒数的整数值"(来源).我可以使用将日期转换为time_t
值mktime()
.例如,要将日期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
值?
DST是否有效地改变了纪元时间,因为mktime
使用当前时区来确定时间.
例如,如果我填充tm
1/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是否对给定的日期/时间有效.