struct tm 中 tm_isdst 字段的解释

Dr.*_*ana 5 c date

时间结构 (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 相关的具体问题如下:

  1. 对于日期(YYYY-MM-DD) 2016-03-16(当 DST 生效时),tm_isdst 应该为 1 吗?或0?

  2. 对于日期(YYYY-MM-DD) 2016-01-16(当 DST 未生效时),tm_isdst 应该为 1 吗?或0?

  3. 2016 年夏令时(美国)于 3 月 13 日(星期日)凌晨 2:00 开始。那么,在 3 月 13 日凌晨 1:45,tm_isdst 的值是多少?谁设置该标志值以及如何设置?

  4. 有没有办法通过某些系统调用检查 DST 何时生效?

chu*_*ica 5

关键问题是 astruct tm代表时间戳,而它的字段不是于 24 小时、12 个月 60 分钟等。DST 字段不必与该日期在该时区使用的时钟相匹配。当然,对于许多应用程序来说,设置为非常规值需要进行纠正。

对于本地时间戳,只需设置所有字段(除了tm_ydaytm_wday不需要设置)并调用mktime(). 它将把所有字段调整到通常的范围,包括设置tm_isdst为 0 或 1。


  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)
  2. 对于日期(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)
  3. 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)
  4. 有没有办法通过某些系统调用检查 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)