標(biāo)準(zhǔn)C庫中只有獲取系統(tǒng)時間的API,好像還沒有設(shè)置系統(tǒng)時間的API,本文將談?wù)勅绾卧趌inux平臺設(shè)置系統(tǒng)時間,最后給出一個與平臺無關(guān)的設(shè)置系統(tǒng)時間的封閉函數(shù)。
linux是如何管理時間的?
在系統(tǒng)啟動時,Linux操作系統(tǒng)將時間從CMOS中讀到系統(tǒng)時間變量中,以后修改時間通過修改系統(tǒng)時間實現(xiàn)。為了保持系統(tǒng)時間與CMOS時間的一致性,Linux每隔11分鐘會將系統(tǒng)時間寫入CMOS,同步時間。從這可以看出,獲取系統(tǒng)時間有兩個途徑,一種是從CMOS中讀,一種是從系統(tǒng)中讀,但修改時間卻只有一種,即修改linux系統(tǒng)中的時間,而修改CMOS中的時間是無效的,因為CMOS中的時間會被定時重寫掉。另外還有一點要注意,修改了系統(tǒng)時間并不是馬上生效的,假如你修改了系統(tǒng)時間并馬上關(guān)機,再開機的時候,時間還是原來的,因為修改的時間還沒有來得及寫入CMOS中。
Linux下設(shè)置系統(tǒng)時間:
1.Linux下設(shè)置系統(tǒng)時間的函數(shù)有好幾個,先來看看最常用的stime()函數(shù),這個函數(shù)只能精確到秒。
#define /*如果你使用的是glib2的話,必須先定義這個宏才能使用*/
#include
int stime(time_t *t);
參數(shù)說明:
t是以秒為單位的時間值,從GMT1970年1月1日0時0分0秒開始計算。
返回值:
成功返回0,錯誤返回-1,errno錯誤碼,EFAULT表示傳遞的參數(shù)錯誤,如時間值是無效的值,EPERM表示權(quán)限不夠,注意只有root用戶才有修改系統(tǒng)時間的權(quán)限。如果要讓普通程序修改系統(tǒng)時間,可以先切換到root用戶操作,修改完成后,再切換到普通用戶,或者用命令chmod +s給執(zhí)行文件加上root用戶的權(quán)限。
例子:
int main(void)
{
long int t = 111111111;
printf("設(shè)置系統(tǒng)時間前的時間是:");
fflush(stdout);
system("date");
stime(&t);
printf("設(shè)置系統(tǒng)時間后的時間是:");
fflush(stdout);
system("date");
return 0;
}
2.通過()函數(shù)來設(shè)置系統(tǒng)時間,這個函數(shù)設(shè)置的精度可以精確到微秒。
#include
int (const struct timeval *tv , const struct *tz);
struct timeval {
time_t tv_sec; /* seconds */
tv_usec; /* */
};
struct {
int ; /* minutes west of */
int ; /* type of DST */
};
tz參數(shù)為時區(qū),時區(qū)結(jié)構(gòu)中在linux中不支持,應(yīng)該置為0,通常將參數(shù)tz設(shè)置為NULL,表示使用當(dāng)前系統(tǒng)的時區(qū)。該函數(shù)是glib中的,但在mingw中沒有實現(xiàn)。
舉例:
1 #include
2 #include
3 #include
4
5 int main(void)
6 {
7 struct timeval stime;
8
9 gettimeofday(&stime,NULL);
10 printf("現(xiàn)在的時間秒數(shù)是:%ld,毫秒數(shù)是:%ld\n現(xiàn)在的時間是:",stime.tv_sec,stime.tv_usec);
11 fflush(stdout);
12 system("date");
13
14 stime.tv_sec = 123456789;
15 settimeofday(&stime,NULL);
16 printf("現(xiàn)在的時間秒數(shù)是:%ld,毫秒數(shù)是:%ld\n現(xiàn)在的時間是:",stime.tv_sec,stime.tv_usec);
17 fflush(stdout);
18 system("date");
19
20
21
22 return 0;
23 }
結(jié)果:
3.設(shè)置CMOS時間,其實它是通過RTC(Real-time clock)設(shè)備驅(qū)動來完成的,你可以用ioctl()函數(shù)來設(shè)置時間,當(dāng)然也可以通過操作/dev/rtc設(shè)備文件,在此就不詳細說明了。
二、一個封裝的設(shè)置系統(tǒng)時間的函數(shù)
//設(shè)置成功返回true,否則返回false
bool (struct tm& t)
#ifdef _WIN32
st;
memset(&st, 0, sizeof());
st.wYear = t.tm_year + 1970; //注意struct tm結(jié)構(gòu)中的年是從1970年開始的計數(shù)
st.wMonth = t.tm_mon + 1; //注意struct tm結(jié)構(gòu)中的月份是從0開始的
st.wDay = t.tm_mday;
st.wHour = t.tm_hour;
st.wMinute = t.tm_min;
st.wSecond = t.tm_sec;
if(!(&st))
return true;
else
return false;
#else
//將struct tm結(jié)構(gòu)時間轉(zhuǎn)換成GMT時間time_t
struct time_t st;
st = mktime(&t);
if(st==-1)
return false;
if(!stime(st))
return true;
else
return false;
#endif
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。