1. 程式人生 > >Linux 關於time()函式的使用注意

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



可以通過改變本地時區,然後再執行上述程式。檢視時間相差是否正確。