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

标签 c datetime

所以 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/

相关文章:

android - Android 上的 TCP FAST OPEN

datetime - 如何处理EDM :DateTime form OData interface in SAPUI5 correct?

Php-MySql查询,根据DateTime选择数据

javascript - 如何转换此 JSON 日期时间?

r - 计算分组行集内耗时

c - 在堆而不是堆栈中分配 C 中的二维数组

c - MIPS 程序集 - 数组?

C 中的字符数组

C - 将用户输入拆分为标记并在输出中识别/格式化它们

python - dt.time. Between 返回 pandas 中的空列