我们一个项目中有如下代码:

time_t loc_time;

loc_time = time(NULL);

localtime_r(&loc_time,&ptr);

这段代码本意是获取本地时间,用于生成日志中的时间戳。

 

但是这个有个问题,当机器的时区变化后,生成的时间信息并不随着时区变化。

查了localtime_r的man手册,发现有下面一段话:

According  to  POSIX.1-2004, localtime() is required to behave as though tzset() was called, while localtime_r() does not have this requirement.  

For portable code tzset() should be called before localtime_r().

 

翻译过来就是,调用localtime_r之前应该先调用tzset函数。

在以上代码localtime_r(&loc_time,&ptr);之前添加tzset()调用后,机器时区变化后,日志中的时间戳也随着时区变化。

附代码如下:

time_t loc_time;

loc_time = time(NULL);

tzset();   //it is important

localtime_r(&loc_time,&ptr);

 

感兴趣的小伙伴,可以写个简单的测试程序实验一下。