正如标题所说,下面是代码。输出中的时区将根据"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表示莫斯科夏令时。
这称为夏令时。