C语言 为什么 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 %sn", 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 %sn", 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

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

谢谢

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

结果:

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

MSK是莫斯科的"常规"时间,MSD表示莫斯科令时。

这称为夏令时

相关内容

  • 没有找到相关文章

最新更新