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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM