歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

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小時)
例如,我通過時間指令(下面會講解),查看嵌入式開發板的系統時間和硬件時間如下:
1
從上圖可以看出,正好驗證了上面提到的CST = UTC + 時區的關系。
二、時間指令
1、系統時間date
查看系統時間和UTC的操作:直接調用date,可以得到本地時間。如果想得到UTC時間的話,使用date -u;
設置系統時間的操作:格式:#date 月日時分年.秒。例如我之前查看的時間不正確,我要手動更改到現在的時間,輸入指令如下:
2
通過指令也可以查看到,系統時間確實已經更改了。
2. 硬件時間 hwclock
直接調用 hwclock 顯示的時間就是 BIOS 中的時間嗎?未必!這要看相關配置文件中是否啟用了UTC,如果啟用了UTC(UTC=true),顯示的其實是經過時區換算的時間而不是BIOS中真正的時間,如果加上 –localtime 選項,則得到的總是 BIOS 中實際的時間。查看指令如下:
3
因為是指令是相繼輸入,所以不是同一時刻的,但是可以看出,嵌入式開發板裡的hwclock指令查看的,就是BIOS中實際的時間。
設置硬件時間的操作:格式:hwclock –set –date==”月/日/年 時:分:秒”。
更多詳細指令可以通過man、help指令進行查看。
三、其他常用查看時間指令
1、uptime命令
4
2、查看喎?http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcHJvYy91cHRpbWXOxLz+vMbL48+1zbPG9LavyrG85DxiciAvPg0KPGltZyBhbHQ9"5" src="http://www.2cto.com/uploadfile/Collfiles/20160328/20160328091206474.png" title="\" />
第一個數字即是系統已經運行的時間482.15秒,用系統工具date即可計算出系統啟動時間,指令如下:

date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H:%M:%S"

結果顯示:
6
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)}'

結果顯示:
7
4、who命令
who -b #查看最後一次系統啟動的時間
8
5、last rebbot查看Linux系統最後一次啟動時間
9
6、還有一些top、w也可以查看到時間
10
11
四、計算系統時間的程序
時間對操作系統來說非常重要,從內核級到應用層,時間的表達方式及精度各部相同。linux內核裡面用一個名為jiffes的常量來計算時間的滴答數。而應用層,可以利用time()、localtime()等函數,通過tm結構體得到系統時間。
Linux內核版本為3.0.35的tm結構體如下:

#ifndef _TM_DEFINED
struct 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()為負。*/

12
程序中需要用到的函數:
time函數獲得日歷時間。日歷時間,是用“從一個標准時間點到此時的時間經過的秒數”來表示的時間。這個標准時間點對不同的編譯器來說會有所不同,但對一個編譯系統來說,這個標准時間點是不變的,該編譯系統中的時間對應的日歷時間都通過該標准時間點來衡量,所以可以說日歷時間是“相對時間”,但是無論你在哪一個時區,在同一時刻對同一個標准時間點來說,日歷時間都是一樣的。
localtime()函數是將日歷時間轉化為本地時間。
asctime()函數是把timeptr指向的tm結構體中儲存的時間轉換為字符串字符串格式返格式為:回,Www Mmm dd hh:mm:ss yyyy。其中Www為星期;Mmm為月份;dd為日;hh為時;mm為分;ss為秒;yyyy為年份
最終代碼如下:

#include 
#include 
#include 
#include 

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

結果顯示:
13

Copyright © Linux教程網 All Rights Reserved