代码之家  ›  专栏  ›  技术社区  ›  Dr. Debasish Jana

结构tm中tm_isdst字段的解释

  •  5
  • Dr. Debasish Jana  · 技术社区  · 9 年前

    时间结构(struct tm)包含一个日历日期和时间,这些日期和时间被分解为其组件。该结构包含九个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
    

    如果夏令时有效,则夏令时标志(tm_isdst)大于零,如果夏令时间无效,则为零,如果信息不可用,则小于零。

    我与tm_isdst相关的具体问题如下:

    1. 对于日期(YYYY-MM-DD)2016-03-16(当DST生效时),应 tm_isd必须为1?还是0?

    2. 日期(YYYY-MM-DD)2016年1月16日(DST未生效时), tmisdst应该是1吗?还是0?

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

    4. 有什么方法可以从一些人那里检查DST何时生效 系统调用?

    2 回复  |  直到 4 年前
        1
  •  5
  •   chux    9 年前

    关键问题是 struct tm 表示时间戳,其字段为 限制为24小时、12个月、60分钟等。DST字段不必与该日期在该时区使用的时钟相匹配。当然,对于许多应用程序,设置为不常用的值需要纠正。

    对于本地时间戳,只需设置所有字段(除了 tm_yday tm_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;
      
    2. 对于日期(YYYY-MM-DD)2016-01-16(DST未生效时),tm_isdst是否应为1?还是0?

      // set to 0 to indicate standard time
      tm.tm_isdst = 0;
      
    3. 2016年夏令时(美国)开始于3月13日星期日凌晨2:00。那么,在3月13号凌晨1:45,tm_isdst的值是多少?谁设置标志的这个值以及如何设置?

      呼叫 mktime() 具有 tm.tm_isdst = -1; 当不确定DST设置时。If代码 知道 这个 将时间 是标准时间,设置 tm_isdst 字段设置为0。它使 没有区别 一年中的什么时间。与DST一样,如果代码知道它是DST时间戳,请将字段设置为1。调用 mktime() 将字段调整为本地时区的通常设置。

      当然,凌晨1:45( 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
      
    4. 有什么方法可以从某个系统调用中检查DST何时生效?

      对要确定 将时间 应该有 tm_isdst 作为0或1,调用 mktime()

      mktime(&tm);  // This will adjust the fields including tm_isdst
      printf("%d\n", tm.tm_isdst);
      

    顺便说一句:健壮代码检查 mktime()

    if (mktime(&tm) == -1) puts("Oops");
    
        2
  •  2
  •   Crowman    9 年前
    1. 应该是 1 (或正值),因为正如您所说,DST是有效的。

    2. 应该是 0 ,因为,正如你所说,DST没有生效。

    3. 应该是 0 ,因为当时DST尚未生效。

    4. 您可以使用 localtime() 要填充 struct tm 在给定的时间内,然后检查该标志的值是多少。这就是它存在的主要原因。