所以 mktime()
返回 time_t
value 定义为“表示自 00:00,1970 年 1 月 1 日 UTC 以来经过的秒数的整数值”(source)。我可以将日期转换为 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);
现在我不明白的是 tm_isdst
背后的想法参数:它被描述为“一个标志,指示夏令时是否在所描述的时间生效”(source)。
这个描述让我有些困惑,因为我认为我在 struct tm
中描述的时间实际上已经是 UTC 时间并且 time_t
我想从 mktime()
获得的值(value)也是UTC。但是UTC时间不会随着季节的变化而变化,那为什么mktime()
呢?根本不需要考虑夏令时吗?使用 UTC 而不是本地时间的优势不是我不必为夏令时而烦恼吗?那么为什么我必须设置 tm_isdst
那么呢?
我确定答案非常简单,但目前我看不到。有人可以提供一个简单的例子来说明为什么 mktime()
需要 tm_isdst
将特定日期和时间转换为 time_t
的参数值(value)?
最佳答案
DST 是否生效会改变纪元时间,因为 mktime
使用当前时区来确定时间。
例如,如果我用 1/1/70 00:00:00 填充 tm
,如下所示:
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;
tv
的值是 18000,因为我的时区是 GMT-5 (18000 = 3600 * 5)。如果我将 tm_isdst
的值更改为 1,则 tv
将设置为 14400 (3600 * 4)。
将 tm_isdst
设置为 -1 将查看本地时区数据库以查看 DST 是否对给定的日期/时间有效。
关于c - 为什么 mktime() 需要知道夏令时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47332528/