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

函数原型:

#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;
}


 

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值