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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个时间戳间隔8小时 时区的问题相关的知识,希望对你有一定的参考价值。

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

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

一个时间戳间隔8小时

当前时间为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调用后就不正常。

一个时间戳间隔8小时

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时间了

 

http代理服务器(3-4-7层代理)-网络事件库公共组件、内核kernel驱动 摄像头驱动 tcpip网络协议栈、netfilter、bridge 好像看过!!!! 但行好事 莫问前程 --身高体重180的胖子



以上是关于一个时间戳间隔8小时 时区的问题的主要内容,如果未能解决你的问题,请参考以下文章

Spark Sql:从时间戳按小时间隔分区

iOS时间问题

根据 Spark 中的小时数拆分时间戳间隔

mysql 8小时问题

date数据写入ES的时区问题

# 神奇的8小时问题