代码中时间处理及相关函数,如UTC时间,时区,time(),gmtime,gmtime_s,gmtime_r,localtime,mktime的相关处理

C库中包含有一系列的时间的相关的处理操作。

概念

UTC时间、GMC时间,及格林威治天文台的时间,也称为中央标准时间。通常这两个时间是相等的。整个世界以这个时间统一作为记录时间戳的时间比较好比较,这样各个国家不同地区就可以统一对比创作时间的先后了。

世界以这个时间划分时区,例如中国为东八区,与格林威治天文台的时间偏移为早八个小时,所以称为东8区。也是就格林威治的8月25日的凌晨1点整,中国的北京时间是上午的9点整。格林威治的8月25的晚上11点,北京时间已经是26日早上的7点钟了。

函数,变量,结构体

首先,头文件包含,Windows下包含:#include<time.h>。Linux下包含:#include<sys/time.h>

变量类型:time_t,是个int的64数据,通常用来记录从1970年1.1,00:00:00到现在过去的秒数。

struct tm;年通常是减去1900之后的,如果要打印显示得加上1900。月份是减1之后得,如果显示得加1。

 struct tm是Windows和Linux下都有,而struct timeval和struct timespec是仅有Linux下才有。不过好多有利用Windows api对这两个结构体进行封装。例

 https://blog.csdn.net/wokaowokaowokao12345/article/details/130224733

struct timeval;精确到微秒,通常是gettimeofday返回这个格式的时间。

struct timespec;精确到纳秒,通常是clock_gettime(CLOCK_REALTIME, &tv)返回这个格式的时间

time()函数,返回time_t格式的秒数,返回当前时区下从格林尼治时间1970年1月1日00:00:00到当前时刻的经过的秒数。内部计算方法可能为先统计标准UTC时间到1970年经过的秒数,然后根据时区加上或者减去对应的秒数,在中国时区下,time函数获取的时间比UCT时间多28800秒。3600*8。以下两种调用格式都对。

time_t t1 =time(NULL);

time_t t1; time(&t1);

localtime();struct tm *localtime(const time_t *timer),获取本地时区时间的tm结构体

c库函数,将time_t秒数,转换成了struct tm结构体,并加入了本地时区的偏移;

gmtime();获取标准UTC时间的结构体

mktime();time_t mktime(struct tm *timeptr)

将struct tm结构体转换成了time_t秒数,不考虑时区关系。mktime只将tm格式的转化成秒数,至于时不时区不考虑,如果该tm不包含时区,那mktime得到的秒数也不包含时区;tm如果待转换tm是时区版,那就包含时区。从tm->time_t,由传入的tm时间,计算其与1970年经过的秒数。只干这件事,不做加减。

记录gmtime和localtime的重坑。

通常gmtime和localtime函数的调用方式如下:

struct tm *tm_gtime, *tm_local;

tm_gtime = gmtime(&rawtime);

tm_local = localtime(&rawtime);

这个时候mktime获取秒数,

time_t t_gtime = mktime(tm_gtime);

time_t local_time = mktime(tm_local);

发现gmtime和localtime获取tm转换成的秒数一模一样。明明gmtime获取的是标准UTC时间,localtime获取的是本地时间,而且本地时区没有问题。结果gmtime获取到的时间居然也是本地时间,秒数也等于localtime的秒数。

坑的位置,gmtime和localtime公用一个tm的全局变量来记录时间,那怕我定义了两个指针变量,可以看到两个指针指向的值居然是同一块地址。所以gmtime之后,在localtime,这时候localtime的操作已经将gmtime的值改变了,变成本地时间了,所以gm获取UTC时间得到的却是本地时间。

如何解决:

如果只是为了获取秒数的话可以gmtime和mktime交替执行,在值发生变化之前给传递出去。

或者,使用struct tm tm_gtime

gmtime_s(&tm_gtime, &rawtime);Windows下

gmtime_r(&rawtime, &tm_gtime);Linux下

这两个不会改变值。注意这里加了取地址,所以tm_gtime不再是tm*,而就是tm类型。

未探究是不是一个是指针,一个不是指针所以这两个函数不会改变原有的值。指针造成的问题还是函数机制本生的问题,待弄清楚。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值