时间结构 (struct tm) 包含分解为各个组成部分的日历日期和时间。该结构包含 9 个 int 类型的成员(任意顺序),它们是:
Member Type Meaning Range
tm_sec int seconds after the minute 0-61*
tm_min int minutes after the hour 0-59
tm_hour int hours since midnight 0-23
tm_mday int day of the month 1-31
tm_mon int months since January 0-11
tm_year int years since 1900
tm_wday int days since Sunday 0-6
tm_yday int days since January 1 0-365
tm_isdst int Daylight Saving Time flag
Run Code Online (Sandbox Code Playgroud)
如果夏令时有效,则夏令时标志 (tm_isdst) 大于零;如果夏令时无效,则夏令时标志 (tm_isdst) 为零;如果信息不可用,则夏令时标志 (tm_isdst) 小于零。
我与 tm_isdst 相关的具体问题如下:
对于日期(YYYY-MM-DD) 2016-03-16(当 DST 生效时),tm_isdst 应该为 1 吗?或0?
对于日期(YYYY-MM-DD) 2016-01-16(当 DST 未生效时),tm_isdst 应该为 1 吗?或0?
2016 年夏令时(美国)于 3 月 13 日(星期日)凌晨 2:00 开始。那么,在 3 月 13 日凌晨 1:45,tm_isdst 的值是多少?谁设置该标志值以及如何设置?
有没有办法通过某些系统调用检查 DST 何时生效?
关键问题是 astruct tm代表时间戳,而它的字段不是于 24 小时、12 个月 60 分钟等。DST 字段不必与该日期在该时区使用的时钟相匹配。当然,对于许多应用程序来说,设置为非常规值需要进行纠正。
对于本地时间戳,只需设置所有字段(除了tm_yday和tm_wday不需要设置)并调用mktime(). 它将把所有字段调整到通常的范围,包括设置tm_isdst为 0 或 1。
对于日期(YYYY-MM-DD) 2016-03-16(当 DST 生效时),tm_isdst 应该为 1 吗?或0?
// set to 1 to indicate DST
tm.tm_isdst = 1;
Run Code Online (Sandbox Code Playgroud)对于日期(YYYY-MM-DD) 2016-01-16(当 DST 未生效时),tm_isdst 应该为 1 吗?或0?
// set to 0 to indicate standard time
tm.tm_isdst = 0;
Run Code Online (Sandbox Code Playgroud)2016 年夏令时(美国)于 3 月 13 日(星期日)凌晨 2:00 开始。那么,在 3 月 13 日凌晨 1:45,tm_isdst 的值是多少?谁设置该标志值以及如何设置?
当不确定夏令时设置时mktime()请拨打。tm.tm_isdst = -1;如果代码知道这struct tm是标准时间,则将该tm_isdst字段设置为 0。一年中的什么时间没有区别。与 DST 类似,如果代码知道它是 DST 时间戳,则将该字段设置为 1。调用mktime()将将该字段调整为本地时区的通常设置。
当然,1:45AM(带有tm_isdst < 0)可以以任何一种方式解释,mktime()通常会选择 0 或 1。
// set to 1 to indicate DST
// set to 0 to indicate standard time
// set to -1 to indicate DST is not known
tm.tm_isdst = -1;
mktime(&tm); // This will adjust all the fields including tm_isdst
Run Code Online (Sandbox Code Playgroud)有没有办法通过某些系统调用检查 DST 何时生效?
是的。要确定 astruct tm应该tm_isdst为 0 还是 1,请调用mktime()
mktime(&tm); // This will adjust the fields including tm_isdst
printf("%d\n", tm.tm_isdst);
Run Code Online (Sandbox Code Playgroud)顺便说一句:健壮的代码检查返回值mktime()
if (mktime(&tm) == -1) puts("Oops");
Run Code Online (Sandbox Code Playgroud)