您好,登錄后才能下訂單哦!
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小時)
例如,我通過時間指令(下面會講解),查看嵌入式開發板的系統時間和硬件時間如下:
從上圖可以看出,正好驗證了上面提到的CST = UTC + 時區的關系。
二、時間指令
1、系統時間date
查看系統時間和UTC的操作:直接調用date,可以得到本地時間。如果想得到UTC時間的話,使用date -u;
設置系統時間的操作:格式:#date 月日時分年.秒。例如我之前查看的時間不正確,我要手動更改到現在的時間,輸入指令如下:
通過指令也可以查看到,系統時間確實已經更改了。
2. 硬件時間 hwclock
直接調用 hwclock 顯示的時間就是 BIOS 中的時間嗎?未必!這要看相關配置文件中是否啟用了UTC,如果啟用了UTC(UTC=true),顯示的其實是經過時區換算的時間而不是BIOS中真正的時間,如果加上 –localtime 選項,則得到的總是 BIOS 中實際的時間。查看指令如下:
因為是指令是相繼輸入,所以不是同一時刻的,但是可以看出,嵌入式開發板里的hwclock指令查看的,就是BIOS中實際的時間。
設置硬件時間的操作:格式:hwclock –set –date==”月/日/年 時:分:秒”。
更多詳細指令可以通過man、help指令進行查看。
三、其他常用查看時間指令
1、uptime命令
2、查看/proc/uptime文件計算系統啟動時間
第一個數字即是系統已經運行的時間482.15秒,用系統工具date即可計算出系統啟動時間,指令如下:
date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H:%M:%S"
結果顯示:
3、通過/proc/uptime文件計算系統運行時間,指令如下;
cat /proc/uptime| awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf("系統已運行:%d天%d時%d分%d秒\n",run_days,run_hour,run_minute,run_second)}'
結果顯示:
4、who命令
who -b #查看最后一次系統啟動的時間
5、last rebbot查看Linux系統最后一次啟動時間
6、還有一些top、w也可以查看到時間
四、計算系統時間的程序
時間對操作系統來說非常重要,從內核級到應用層,時間的表達方式及精度各部相同。linux內核里面用一個名為jiffes的常量來計算時間的滴答數。而應用層,可以利用time()、localtime()等函數,通過tm結構體得到系統時間。
Linux內核版本為3.0.35的tm結構體如下:
#ifndef _TM_DEFINEDstruct tm {int tm_sec; /* 秒 – 取值區間為[0,59] */int tm_min; /* 分 - 取值區間為[0,59] */int tm_hour; /* 時 - 取值區間為[0,23] */int tm_mday; /* 一個月中的日期 - 取值區間為[1,31] */int tm_mon; /* 月份(從一月開始,0代表一月) - 取值區間為[0,11] */int tm_year; /* 年份,其值等于實際年份減去1900 */int tm_wday; /* 星期 – 取值區間為[0,6],其中0代表星期天,1代表星期一,以此類推 */int tm_yday; /* 從每年的1月1日開始的天數 – 取值區間為[0,365],其中0代表1月1日,1代表1月2日,以此類推 */int tm_isdst; /* 夏令時標識符,實行夏令時的時候,tm_isdst為正。不實行夏令時的進候,tm_isdst為0;不了解情況時,tm_isdst()為負。*/
程序中需要用到的函數:
time函數獲得日歷時間。日歷時間,是用“從一個標準時間點到此時的時間經過的秒數”來表示的時間。這個標準時間點對不同的編譯器來說會有所不同,但對一個編譯系統來說,這個標準時間點是不變的,該編譯系統中的時間對應的日歷時間都通過該標準時間點來衡量,所以可以說日歷時間是“相對時間”,但是無論你在哪一個時區,在同一時刻對同一個標準時間點來說,日歷時間都是一樣的。
localtime()函數是將日歷時間轉化為本地時間。
asctime()函數是把timeptr指向的tm結構體中儲存的時間轉換為字符串字符串格式返格式為:回,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; }
結果顯示:
關于Linux應用層中怎么查看系統時間問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。