在daylight全局变量的time.h header 中,它表示:
“如果应用了夏令时规则,此变量的值将为非零。非零值并不一定意味着夏令时已生效;仅意味着夏令时有时会生效。”

现在我注意到在Solaris 11.2和Linux中,即使我的时区根本不使用夏令时(澳大利亚/布里斯类),“daylight”变量也被设置为1。

示例代码证实了这一点,如果我运行tzset并输出全局变量,我们将得到:
夏令时= 1 tz [0] = [AEST] tz [1] = [AEDT]时区= [-36000]

但是据我所知,应该将夏令时设置为0,因为我的区域在一年中的任何时候都没有夏令时。

我还注意到,将struct tm设置为当前时间时会返回tm_isdst = 0,这是正确的。

那么为什么将日光变量设置为1?不应该将其设置为0吗?还是我误解了这一点?

代码是:

#include <stdio.h>
#include <time.h>
void main()
{
  time_t t;
  struct tm     *tms = { 0 };
  tzset();
  time(&t);
  tms = localtime(&t);
  printf("date and time : %s",ctime(&t));
  printf("daylight = %d tz[0] = [%s] tz[1] = [%s] timezone = [%ld]\n", daylight, tzname[0], tzname[1], timezone);
  printf("tm_isdst = %d\n",tms->tm_isdst);
}

输出为:
date and time : Mon Nov 30 16:41:01 2015
daylight = 1 tz[0] = [AEST] tz[1] = [AEDT] timezone = [-36000]
tm_isdst = 0

最佳答案

关于C标准tm_isdst成员。



这与关于* nix全局变量daylight的* nix规范略有不同。daylight不是标准C的一部分。

gnu.org报告


tm_isdst是指struct tm时间戳。这仅意味着DST对于该时间戳有效。
daylight != 0表示有时在时区的时间戳中使用DST。

正如澳大利亚/布里斯类曾经在1972年之前(@Jon Skeet)观察到DST一样,使用daylight == 1是合理的,因为daylight表示该时区的DST在某些时间段内有效(可能从1970年开始)。

OP的“...即使我的时区根本不使用夏令时”也是不正确的。

下面的代码显示,自1970年以来,“Australia/Brisbane”中已使用DST(至少timezone DB如此认为)。

#include<time.h>
#include<stdlib.h>
#include<sys/time.h>

int main(void) {
  setenv("TZ", "Australia/Brisbane", 1);
  tzset();
  time_t now;
  time(&now);
  struct tm tm;
  int isdst = 42; // See Hitchhiker's_Guide_to_the_Galaxy
  time_t t;
  for (t = 0; t < now; t += 3600) {
    tm = *localtime(&t);
    if (tm.tm_isdst != isdst) {
      printf("dst:%d %s", tm.tm_isdst, ctime(&t));
      isdst = tm.tm_isdst;
    }
  }
  printf("dst:%d %s", tm.tm_isdst, ctime(&t));
  return 0;
}

输出
dst:0 Thu Jan  1 10:00:00 1970
dst:1 Sun Oct 31 03:00:00 1971
dst:0 Sun Feb 27 02:00:00 1972
dst:1 Sun Oct 29 03:00:00 1989
dst:0 Sun Mar  4 02:00:00 1990
dst:1 Sun Oct 28 03:00:00 1990
dst:0 Sun Mar  3 02:00:00 1991
dst:1 Sun Oct 27 03:00:00 1991
dst:0 Sun Mar  1 02:00:00 1992
dst:0 Tue Dec  1 16:00:00 2015

关于c - tzset和daylight全局变量在time.h中的解释,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33992832/

10-13 07:48