天天看點

Linux應用層檢視系統時間的方法

一、基本概念:

    1、linux系統時間和硬體時間:

    系統時間:一般來說就是我們執行date指令檢視到的時間,Linux系統下所有的時間調用(除了直接通路硬體時間的指令)都是使用這個時間。

    硬體時間:主機闆上BIOS中的時間,由主機闆電池供電來維持運作,系統開機時要讀取這個時間,并根據它來設定系統時間。(注意:系統啟動時根據硬體時間設定系統時間的過程可能存在時區換算,這要視具體的系統及相關設定而定)。

    2、UTC時間與問題時間:

    UTC時間:Coordinated Universal Time,也就是協調世界時,又稱世界統一時間,世界标準時間,國際協調時間。在一般精度要求下,它與GMT(Greenwich Mean Time,世界時UT即格林威治标準時間)是一樣的。

    本地時間:由于處在不同的時區,本地時間一般與UTC是不同的,換算方法是:本地時間 = UTC + 時區。時區東為正,西為負,例如在中國,本地時間都是使用中原標準時間,在Linux上就是CST(China Standard Time,中國标準時,注意美國的中部标準時Central Standart Time也縮寫為CST,與這裡的CST不是一回事),時區為東八區,也就是+8區,是以CST = UTC + (+8小時)

    例如,我通過時間指令(下面會講解),檢視嵌入式開發闆的系統時間和硬體時間如下:

Linux應用層檢視系統時間的方法

    從上圖可以看出,正好驗證了上面提到的CST = UTC + 時區的關系。

二、時間指令

    1、系統時間date

    檢視系統時間和UTC的操作:直接調用date,可以得到本地時間。如果想得到UTC時間的話,使用date -u;

    設定系統時間的操作:格式:#date 月日時分年.秒。例如我之前檢視的時間不正确,我要手動更改到現在的時間,輸入指令如下:

Linux應用層檢視系統時間的方法

    通過指令也可以檢視到,系統時間确實已經更改了。

    2. 硬體時間 hwclock

    直接調用 hwclock 顯示的時間就是 BIOS 中的時間嗎?未必!這要看相關配置檔案中是否啟用了UTC,如果啟用了UTC(UTC=true),顯示的其實是經過時區換算的時間而不是BIOS中真正的時間,如果加上 –localtime 選項,則得到的總是 BIOS 中實際的時間。檢視指令如下:

Linux應用層檢視系統時間的方法

    因為是指令是相繼輸入,是以不是同一時刻的,但是可以看出,嵌入式開發闆裡的hwclock指令檢視的,就是BIOS中實際的時間。

    設定硬體時間的操作:格式:hwclock –set –date==”月/日/年 時:分:秒”。

    更多詳細指令可以通過man、help指令進行檢視。

三、其他常用檢視時間指令

    1、uptime指令

Linux應用層檢視系統時間的方法

    2、檢視/proc/uptime檔案計算系統啟動時間

Linux應用層檢視系統時間的方法

    第一個數字即是系統已經運作的時間482.15秒,用系統工具date即可計算出系統啟動時間,指令如下:

    結果顯示:

Linux應用層檢視系統時間的方法

    3、通過/proc/uptime檔案計算系統運作時間,指令如下;

Linux應用層檢視系統時間的方法

    4、who指令

    who -b #檢視最後一次系統啟動的時間

Linux應用層檢視系統時間的方法

    5、last rebbot檢視Linux系統最後一次啟動時間

Linux應用層檢視系統時間的方法

    6、還有一些top、w也可以檢視到時間

Linux應用層檢視系統時間的方法
Linux應用層檢視系統時間的方法

四、計算系統時間的程式

    時間對作業系統來說非常重要,從核心級到應用層,時間的表達方式及精度各部相同。linux核心裡面用一個名為jiffes的常量來計算時間的滴答數。而應用層,可以利用time()、localtime()等函數,通過tm結構體得到系統時間。

    Linux核心版本為3.0.35的tm結構體如下:

Linux應用層檢視系統時間的方法

    程式中需要用到的函數:

    time函數獲得月曆時間。月曆時間,是用“從一個标準時間點到此時的時間經過的秒數”來表示的時間。這個标準時間點對不同的編譯器來說會有所不同,但對一個編譯系統來說,這個标準時間點是不變的,該編譯系統中的時間對應的月曆時間都通過該标準時間點來衡量,是以可以說月曆時間是“相對時間”,但是無論你在哪一個時區,在同一時刻對同一個标準時間點來說,月曆時間都是一樣的。

    localtime()函數是将月曆時間轉化為本地時間。

    asctime()函數是把timeptr指向的tm結構體中儲存的時間轉換為字元串字元串格式返格式為:回,Www Mmm dd hh:mm:ss yyyy。其中Www為星期;Mmm為月份;dd為日;hh為時;mm為分;ss為秒;yyyy為年份

    最終代碼如下:

Linux應用層檢視系統時間的方法