Linux 關於time()函式的使用注意
阿新 • • 發佈:2019-02-06
函式原型:
#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; }
可以通過改變本地時區,然後再執行上述程式。檢視時間相差是否正確。