为什么localtime()在同一台机器上提供不同的时区?

时间:2017-03-23 23:07:05

标签: c timezone localtime

正如标题所说,下面是代码。输出中的时区将根据" tmt"。

的值进行更改

环境:

[/tmp@16:01]uname -a
Linux ubuntu 3.13.0-100-generic #147-Ubuntu SMP Tue Oct 18 16:48:51 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

代码:

#include <stdio.h>
#include <time.h>
#include <strings.h>

#define LOCKOUT_TIME_FORMAT     "%Y-%m-%dT%H:%M:%S%z"

int main()
{
        time_t tmt = 0;
        time_t tmt1 = 0;
        struct tm * ptm = NULL;
        char str[128] = {0};


        time(&tmt1);
        ptm = localtime(&tmt1);
        strftime(str, sizeof(str), LOCKOUT_TIME_FORMAT, ptm);
        printf("time1 is %s\n", str);

        //tmt=3600 * 24 * 30;                       //one month
        //tmt=3600 * 24 * 30 * 6;                   //about six month
        //tmt=3600 * 24 * 30 * 12;                  //about one year
        //tmt=3600 * 24 * 30 * 12 * 10;             //about ten years
        //tmt=3600 * 24 * 30 * 12 * 11;             //about 11 years
        tmt=3600 * 24 * 30 * 12 * 20;               //about 20 years

        ptm = localtime(&tmt);
        strftime(str, sizeof(str), LOCKOUT_TIME_FORMAT, ptm);
        printf("time is %s\n", str);

        return 0;
}

当tmt = 3600 * 24 * 30 * 12 * 20时,tmt和tmt1的输出时区将相同。

[/tmp@15:58]./a.out 
time1 is 2017-03-23T15:58:20-0700
time is 1989-09-17T17:00:00-0700

当tmt是代码中注释掉的其他值时,tmt和tmt1的输出时区将不同!

[/tmp@16:01]./a.out 
time1 is 2017-03-23T16:01:07-0700
time is 1980-11-03T16:00:00-0800

就个人而言,我认为时区应该是相同的,因为代码在同一台机器上运行。为什么时区会随时间变化?

谢谢,

1 个答案:

答案 0 :(得分:2)

localtime()正确处理夏令时转换 您输入int tmt 变量的日期是夏令时之一,而当前日期不是夏日。
我建议使用这种输出格式进行测试(&#34;%Z&#34;表示&#34;时区名称或缩写&#34;)
#define LOCKOUT_TIME_FORMAT "%Y-%m-%dT%H:%M:%S\t|%Z"

结果:

$ TZ="Europe/Moscow" ./test
time1 is 2017-03-24T03:01:07    |MSK
time is 1989-09-18T04:00:00     |MSD

MSK是莫斯科&#34;常规&#34;时间和MSD意味着莫斯科夏天时间。

这称为Daylight Saving Time