Linux 关于time()函数的使用注意

来源:互联网 发布:大数据时代的小数据 编辑:程序博客网 时间:2024/05/01 18:28

函数原型:

#include <time.h>time_t time(time_t *t);

获取当前时间,即从1970年1月1日 00:00:00到当前时刻的秒数。
这里注意,这个当前时间并不是系统显示的时间(date所看到的时间),
而是从0时区的1970年1月1日 00:00:00到当前0时区的那一时刻的秒数。
即:即使在不同的服务器上,抑或在不同的时区中,只要系统时间一样,那么用time获取到的时间都是相同的。
如果要转化为本地时间,则要用localtime函数。即要将时区加上
比如北京时间是+8时区,则需要加上8个小时的秒数。


问题产生:
如果一个模块,需要在每天0点做一个操作,而这个模块中判断零点的方法是用如下方法:

time_t _now;time(&_now);if(0 == (now%(24*60*60))){// run job}

如果在+8时区,就会发现,这个任务会在每天早上8点执行,而在0点是不会执行的。

问题原因:
正是前面所述的时区问题导致的。
要知道time获取的秒数,是比当前+8时区的时间慢了8个小时。

问题验证:
使用time获取的秒数,打印当前的时间的 时分秒。
使用localtime将time获取的秒数转化为本地时间,并打印时分秒。

<pre name="code" class="html">#include <stdio.h>#include <time.h>#include <sys/time.h>int main(){// 当忽略年份的时候,time函数获取的秒数是由天数组成的        time_t now;        time(&now);        printf("%u\n", now);        printf("days: %u, hour: %u, min: %u, sec: %u\n",                now/(24*60*60),                (now%(24*60*60))/(60*60),                ((now%(24*60*60))%(60*60))/60,                ((now%(24*60*60))%(60*60))%60);// 另外一种获取时间的方法,与time函数一样,不过该函数可以获取到时区偏移// 时区偏移单位是分钟,即+8时区的偏移为 -480分钟(0时区 减去 +8时区,所以为负值)        struct timeval tv;         struct timezone tz;         gettimeofday(&tv, &tz);        printf("%u %u\n", tv.tv_sec, tv.tv_usec);        printf("%d %d\n", tz.tz_minuteswest, tz.tz_dsttime);// 使用localtime将time获取的时间转为本地时间,与上面的时分秒进行比较,相差刚好八个小时。        struct tm tm_;        localtime_r(&now, &tm_);        printf("%04d-%02d-%02d %02d:%02d:%02d\n",                1900+tm_.tm_year, 1+tm_.tm_mon, tm_.tm_mday, tm_.tm_hour, tm_.tm_min, tm_.tm_sec);        return 0;}



可以通过改变本地时区,然后再运行上述程序。查看时间相差是否正确。


0 0