close

linux中如何讀取並修改系統時間?

 [root@linux ~]# date MMDDhhmmYYYY
參數:
MM:月份
DD:日期
hh:小時
mm:分鐘
YYYY:西元年
 
1. 修改時間成為 1 小時後的時間該如何是好?
[root@linux ~]# date
Thu Dec  7 15:36:45 CST 2006
 
[root@linux ~]# date 120716362006
Thu Dec  7 16:36:00 CST 2006
# 瞧!時間立刻就修改過來了!

 

[root@linux ~]# hwclock [-rw]
參數:
-r :亦即 read ,讀出目前 BIOS 內的時間參數;
-w :亦即 write ,將目前的 Linux 系統時間寫入 BIOS 當中啊!
 
2. 查閱 BIOS 時間,並且寫入更改過的時間囉!
[root@linux ~]# hwclock -r
Thu Dec  7 15:37:44 2006  -0.627128 seconds
# 看一看,是否剛好差異約一個小時啊!這就是 BIOS 時間!
 
[root@linux ~]# hwclock -w
# 這樣就寫入囉~很簡單吧!

 


Linux程式設計-時間處理

UNIXLinux的時間系統是由「新紀元時間」Epoch開始計算起,單位為秒,Epoch則是指定為1970年一月一日凌晨零點零分零秒,格林威治時間。 
目前大部份的UNIX系統都是用32位元來記錄時間,正值表示為1970以後,負值則表示1970年以前。

 

在所有的UNIX下,都有個time()的函數 
#include  

time_t time(time_t *t); 

 

這個函數會傳回從epoch開始計算起的秒數,如果tnon-null,它將會把時間值填入t中。

 

#include <time.h>

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

 

int main()

{

    int i;

    time_t the_time;

 

    for(i = 1; i <= 10; i++) {

        the_time = time((time_t *)0);

        printf("The time is %ld\n", the_time);

        sleep(2);

    }

    exit(0);

}

這個程式執行完之後會獲得一長串的數字如:191317

對他做時間的乘除獲得的結果會跟你當時執行此程式時的系統時間一樣。

後面會介紹一些整理此串數字的函數,以利程式設計者能夠更方便的解讀。

 


時間表述 

電腦使用秒及epoch來表示其時間,但對人腦來說實在太殘忍一點,大概沒有人可以用人腦來計算。因此,UNIX下提供了其它兩種基本方式來表述時間,struct tm及文字格式時間。 

 

struct tm 

    int tm_sec; 
    int tm_min; 
    int tm_hour; 
    int tm_mday; 
    int tm_mon; 
    int tm_year; 
    int tm_wday; 
    int tm_yday; 
    int tm_isdst; 
}; 

tm_sec
表「秒」數,在[0,61]之間,多出來的兩秒是用來處理跳秒問題用的。 
tm_min
表「分」數,在[0,59]之間。 
tm_hour
表「時」數,在[0,23]之間。 
tm_mday
表「本月第幾日」,在[1,31]之間。 
tm_mon
表「本年第幾月」,在[0,11]之間。 
tm_year
要加1900表示那一年。 
tm_wday
表「本第幾日」,在[0,6]之間。 
tm_yday
表「本年第幾日」,在[0,365]之間,閏年有366日。 
tm_isdst
表是否為「日光節約時間」。 

struct tm
格式時間函數 

struct tm * gmtime(const time_t * t); 
轉換成格林威治時間。有時稱為GMTUTC 

struct tm * localtime(const time_t *t); 
轉換成本地時間。它可以透過修改TZ環境變數來在一台機器中,不同使用者表示不同時間。 

time_t mktime(struct tm *tp); 
轉換tm成為time_t格式,使用本地時間。 

tme_t timegm(strut tm *tp); 
轉換tm成為time_t格式,使用UTC時間。 

double difftime(time_t t2,time_t t1); 
計算秒差。 

文字時間格式函數 

char * asctime(struct tm *tp); 
char * ctime(struct tm *tp); 
這兩個函數都轉換時間格式為標準UNIX時間格式。 
Mon May 3 08:23:35 1999 

ctime
一率使用當地時間,asctime則用tm結構內的timezone資訊來表示。 

size_t strftime(char *str,size_t max,char *fmt,struct tm *tp); 
strftime
有點像sprintf,其格式由fmt來指定。 

%a : 
本第幾天名稱,縮寫。 
%A : 
本第幾天名稱,全稱。 
%b : 
月份名稱,縮寫。 
%B : 
月份名稱,全稱。 
%c : 
ctime/asctime格式相同。 
%d : 
本月第幾日名稱,由零算起。 
%H : 
當天第幾個小時,24小時制,由零算起。 
%I : 
當天第幾個小時,12小時制,由零算起。 
%j : 
當年第幾天,由零算起。 
%m : 
當年第幾月,由零算起。 
%M : 
該小時的第幾分,由零算起。 
%p : AM
PM 
%S : 
該分鐘的第幾秒,由零算起。 
%U : 
當年第幾,由第一個日開始計算。 
%W : 
當年第幾,由第一個一開始計算。 
%w : 
當第幾日,由零算起。 
%x : 
當地日期。 
%X : 
當地時間。 
%y : 
兩位數的年份。 
%Y : 
四位數的年份。 
%Z : 
時區名稱的縮寫。 
%% : %
符號。 

char * strptime(char *s,char *fmt,struct tm *tp); 
如同scanf一樣,解譯字串成為tm格式。 

%h : 
%b%B同。 
%c : 
讀取%x%X格式。 
%C : 
讀取%C格式。 
%e : 
%d同。 
%D : 
讀取%m/%d/%y格式。 
%k : 
%H同。 
%l : 
%I同。 
%r : 
讀取"%I:%M:%S %p"格式。 
%R : 
讀取"%H:%M"格式。 
%T : 
讀取"%H:%M:%S"格式。 
%y : 
讀取兩位數年份。 
%Y : 
讀取四位數年份。 

 

資料來源:

http://jyhshin.pixnet.net/blog/post/27749433

http://fanqiang.chinaunix.net/a4/b8/20010527/201001267_b.html

linux程式設計教學手冊(第四版)

http://linux.vbird.org/linux_server/0440ntp.php#client

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 flykof 的頭像
    flykof

    十年磨一劍

    flykof 發表在 痞客邦 留言(0) 人氣()