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

所以 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 是否对给定的日期/时间有效。

https://stackoverflow.com/questions/47332528/

相关文章:

batch-file - 在没有出现超时消息的情况下在批处理文件中运行超时命令

python - 如何计算图像中的亮像素?

typescript - 为什么 TypeScript 不为接口(interface)生成代码?

r - 如何从日期获取 ISO 周数

r - 计算 R 中分类变量的出现次数

msbuild - 使用 MSBuild 通过 VS2017 构建 SSDT 项目失败

python-2.7 - 我怎么知道我使用的是哪个版本的 Tkinter?

laravel - 批量更新 Laravel 中具有多关系的表

haskell - `pure x = (\_ -> x)` 是什么意思?

php - 为什么以及如何将 new 关键字与类的现有对象一起使用?