首页 > 其他分享 >一个时间戳间隔8小时 时区的问题

一个时间戳间隔8小时 时区的问题

时间:2023-02-03 14:57:38浏览次数:41  
标签:02d 间隔 seconds2 seconds1 tm 时间 time 小时 时区

关于时间函数可以参考:以前的文章

目前应用层程序打印log,一直和系统时间相隔8个小时, 但是自己编写的demo打印时间正常,

当前时间为14点多但是总是打印出来为06:xx多少。

应用程序使用time 和localtime_r 后输出时间戳,但是输出到log中,时间为06:xxx

使用demo测试结果为

 seconds1 = time((time_t *)&seconds2);//从打印结果可以看到seconds1,seconds2可以通过time()函数把值返回到俩个不同的地址
 13     if(seconds1 != -1) {
 14         printf("seconds1=%d\n", seconds1);
 15         printf("seconds2=%d\n", seconds2);
 16     }else
 17         printf("Error:get seconds Error,errno is %d\n", errno);
 18 
 19     localtime_r(&seconds2, &tmp);
 20 #define LOG_DATE_FMT "%04d/%02d/%02d %02d:%02d:%02d"             //!< 日志输出时间格式
 21 #define LOG_DATE_STR(t) (t)->tm_year + 1900, (t)->tm_mon + 1, \
 22     (t)->tm_mday, (t)->tm_hour, (t)->tm_min, (t)->tm_sec         //!< 日志输出时间参数
 23 
 24     printf(LOG_DATE_FMT "\n", LOG_DATE_STR(&tmp));
 25 printf("当前的本地时间和日期:%s", asctime(&tmp));

seconds1=1675406462
seconds2=1675406462
2023/02/03 14:41:02
当前的本地时间和日期:Fri Feb  3 14:41:02 2023
也就是 demo用同样的函数,输出时间正常,但是应用程序有问题, 同时使用date 命令测试也是正常。

使用gdb 跟踪发现time获取到的UTC时间 使用date --date='@1675394538'  显示正常,经过local_time调用后就不正常。

date --date='@1675394538
Fri Feb  3 11:22:18 CST 2023

也就是 应用程序中存在某些原因导致出现上述问题,应该是utc 转换为cst出现问题, 

原因为:time获取到时间为UTC时间, UTC时间根据时区(北京时间)最后输出cst时间。

strace demo可知,其会调用 openat(AT_FDCWD, "/etc/localtime", O_RDONLY|O_CLOEXEC) = 3 

也就是 localtimer函数会根据时区文件配置 将utc 时间转化为对应的GMT等时间。

strace 应用程序发现 其open的localtime文件不存在,就默认输出UTC---->GMT+0时间了

 

标签:02d,间隔,seconds2,seconds1,tm,时间,time,小时,时区
From: https://www.cnblogs.com/codestack/p/17089243.html

相关文章