您好,登錄后才能下訂單哦!
Linux應(yīng)用層中怎么查看系統(tǒng)時間,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
一、基本概念:
1、linux系統(tǒng)時間和硬件時間:
系統(tǒng)時間:一般來說就是我們執(zhí)行date命令查看到的時間,Linux系統(tǒng)下所有的時間調(diào)用(除了直接訪問硬件時間的命令)都是使用這個時間。
硬件時間:主板上BIOS中的時間,由主板電池供電來維持運行,系統(tǒng)開機時要讀取這個時間,并根據(jù)它來設(shè)定系統(tǒng)時間。(注意:系統(tǒng)啟動時根據(jù)硬件時間設(shè)定系統(tǒng)時間的過程可能存在時區(qū)換算,這要視具體的系統(tǒng)及相關(guān)設(shè)置而定)。
2、UTC時間與問題時間:
UTC時間:Coordinated Universal Time,也就是協(xié)調(diào)世界時,又稱世界統(tǒng)一時間,世界標準時間,國際協(xié)調(diào)時間。在一般精度要求下,它與GMT(Greenwich Mean Time,世界時UT即格林威治標準時間)是一樣的。
本地時間:由于處在不同的時區(qū),本地時間一般與UTC是不同的,換算方法是:本地時間 = UTC + 時區(qū)。時區(qū)東為正,西為負,例如在中國,本地時間都是使用北京時間,在Linux上就是CST(China Standard Time,中國標準時,注意美國的中部標準時Central Standart Time也縮寫為CST,與這里的CST不是一回事),時區(qū)為東八區(qū),也就是+8區(qū),所以CST = UTC + (+8小時)
例如,我通過時間指令(下面會講解),查看嵌入式開發(fā)板的系統(tǒng)時間和硬件時間如下:
從上圖可以看出,正好驗證了上面提到的CST = UTC + 時區(qū)的關(guān)系。
二、時間指令
1、系統(tǒng)時間date
查看系統(tǒng)時間和UTC的操作:直接調(diào)用date,可以得到本地時間。如果想得到UTC時間的話,使用date -u;
設(shè)置系統(tǒng)時間的操作:格式:#date 月日時分年.秒。例如我之前查看的時間不正確,我要手動更改到現(xiàn)在的時間,輸入指令如下:
通過指令也可以查看到,系統(tǒng)時間確實已經(jīng)更改了。
2. 硬件時間 hwclock
直接調(diào)用 hwclock 顯示的時間就是 BIOS 中的時間嗎?未必!這要看相關(guān)配置文件中是否啟用了UTC,如果啟用了UTC(UTC=true),顯示的其實是經(jīng)過時區(qū)換算的時間而不是BIOS中真正的時間,如果加上 –localtime 選項,則得到的總是 BIOS 中實際的時間。查看指令如下:
因為是指令是相繼輸入,所以不是同一時刻的,但是可以看出,嵌入式開發(fā)板里的hwclock指令查看的,就是BIOS中實際的時間。
設(shè)置硬件時間的操作:格式:hwclock –set –date==”月/日/年 時:分:秒”。
更多詳細指令可以通過man、help指令進行查看。
三、其他常用查看時間指令
1、uptime命令
2、查看/proc/uptime文件計算系統(tǒng)啟動時間
第一個數(shù)字即是系統(tǒng)已經(jīng)運行的時間482.15秒,用系統(tǒng)工具date即可計算出系統(tǒng)啟動時間,指令如下:
date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H:%M:%S"
結(jié)果顯示:
3、通過/proc/uptime文件計算系統(tǒng)運行時間,指令如下;
cat /proc/uptime| awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf("系統(tǒng)已運行:%d天%d時%d分%d秒\n",run_days,run_hour,run_minute,run_second)}'
結(jié)果顯示:
4、who命令
who -b #查看最后一次系統(tǒng)啟動的時間
5、last rebbot查看Linux系統(tǒng)最后一次啟動時間
6、還有一些top、w也可以查看到時間
四、計算系統(tǒng)時間的程序
時間對操作系統(tǒng)來說非常重要,從內(nèi)核級到應(yīng)用層,時間的表達方式及精度各部相同。linux內(nèi)核里面用一個名為jiffes的常量來計算時間的滴答數(shù)。而應(yīng)用層,可以利用time()、localtime()等函數(shù),通過tm結(jié)構(gòu)體得到系統(tǒng)時間。
Linux內(nèi)核版本為3.0.35的tm結(jié)構(gòu)體如下:
#ifndef _TM_DEFINEDstruct tm {int tm_sec; /* 秒 – 取值區(qū)間為[0,59] */int tm_min; /* 分 - 取值區(qū)間為[0,59] */int tm_hour; /* 時 - 取值區(qū)間為[0,23] */int tm_mday; /* 一個月中的日期 - 取值區(qū)間為[1,31] */int tm_mon; /* 月份(從一月開始,0代表一月) - 取值區(qū)間為[0,11] */int tm_year; /* 年份,其值等于實際年份減去1900 */int tm_wday; /* 星期 – 取值區(qū)間為[0,6],其中0代表星期天,1代表星期一,以此類推 */int tm_yday; /* 從每年的1月1日開始的天數(shù) – 取值區(qū)間為[0,365],其中0代表1月1日,1代表1月2日,以此類推 */int tm_isdst; /* 夏令時標識符,實行夏令時的時候,tm_isdst為正。不實行夏令時的進候,tm_isdst為0;不了解情況時,tm_isdst()為負。*/
程序中需要用到的函數(shù):
time函數(shù)獲得日歷時間。日歷時間,是用“從一個標準時間點到此時的時間經(jīng)過的秒數(shù)”來表示的時間。這個標準時間點對不同的編譯器來說會有所不同,但對一個編譯系統(tǒng)來說,這個標準時間點是不變的,該編譯系統(tǒng)中的時間對應(yīng)的日歷時間都通過該標準時間點來衡量,所以可以說日歷時間是“相對時間”,但是無論你在哪一個時區(qū),在同一時刻對同一個標準時間點來說,日歷時間都是一樣的。
localtime()函數(shù)是將日歷時間轉(zhuǎn)化為本地時間。
asctime()函數(shù)是把timeptr指向的tm結(jié)構(gòu)體中儲存的時間轉(zhuǎn)換為字符串字符串格式返格式為:回,Www Mmm dd hh:mm:ss yyyy。其中Www為星期;Mmm為月份;dd為日;hh為時;mm為分;ss為秒;yyyy為年份
最終代碼如下:
#include <stdio.h>#include <sys/sysinfo.h>#include <time.h>#include <errno.h>int print_system_boot_time();int main ( int argc, char ** argv ) {if ( print_system_boot_time() != 0 )return -1;return 0; } print_system_boot_time() {int year,month,day,wday,hour,min,sec;struct sysinfo info;struct tm *ptm = NULL; time_t cur_time = 0;if(sysinfo(&info)) {fprintf(stderr, "Failed to get sysinfo, errno:%u, reason:%s\n", errno, strerror(errno)); } time(&cur_time); ptm = localtime(&cur_time); year = ptm->tm_year + 1900; //年month = ptm->tm_mon + 1; //月day = ptm->tm_mday; //日wday = ptm->tm_wday; //星期hour = ptm->tm_hour; //小時min = ptm->tm_min; //分sec = ptm->tm_sec; //秒printf("The current date: %d-%-.2d-%d 星期%d %d:%.2d:%.2d\n", year, month, day, wday, hour, min, sec);printf("The current date is %s",asctime(ptm));return 0; }
結(jié)果顯示:
關(guān)于Linux應(yīng)用層中怎么查看系統(tǒng)時間問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。