Linux核心中獲取時間並轉換成本地時區時間
下面的函式get_time_str實現了在核心中獲取本地時間的功能。
他首先獲取utc時間,然後根據系統的時區timezone轉換成本地時間,
最後將時間以“2014-11-02 21:14:08”的字串的形式輸出到output緩衝區中。
函式的返回值,是輸出的字串的長度。
#include <linux/time.h>
#include <linux/timex.h>
#include <linux/rtc.h>
int get_time_str(char *output)
{
struct timex txc;
struct rtc_time tm;
/* 獲取當前的UTC時間 */
do_gettimeofday(&(txc.time));
/* 把UTC時間調整為本地時間 */
txc.time.tv_sec -= sys_tz.tz_minuteswest * 60;
/* 算出時間中的年月日等數值到tm中 */
rtc_time_to_tm(txc.time.tv_sec,&tm);
return sprintf(output, "%04d-%02d-%02d %02d:%02d:%02d"
,tm.tm_year+1900
,tm.tm_mon+1
,tm.tm_mday
,tm.tm_hour
,tm.tm_min
,tm.tm_sec);
}
事實上,系統呼叫gettimeofday就是由sys_gettimeofday()實現的。
而sys_gettimeofday()也就是簡單的將呼叫do_gettimeofday()得到的時間值拷貝給使用者態。
其程式碼如下:
asmlinkage long sys_gettimeofday(struct timeval __user *tv, struct timezone __user *tz)
{
if (likely(tv != NULL)) {
struct timeval ktv;
do_gettimeofday(&ktv);
if (copy_to_user(tv, &ktv, sizeof(ktv)))
return -EFAULT;
}
if (unlikely(tz != NULL)) {
if (copy_to_user(tz, &sys_tz, sizeof(sys_tz)))
return -EFAULT;
}
return 0;
}