正如标题所说,下面是代码。输出中的时区将根据" 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
就个人而言,我认为时区应该是相同的,因为代码在同一台机器上运行。为什么时区会随时间变化?
谢谢,
答案 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意味着莫斯科夏天时间。