Linux系統設置系統時間有兩種方法:
1.使用命令date
2.使用系統調用settimeofday,gettimeofday
注意:不管使用上面哪一種方法都必須是root權限。
如果系統連接上了網絡,設置的時間和網絡時間不同,系統會自動使用網絡中的時間。
1.使用命令date
在命令行中可以使用:
sudo date --s "2020-6-30 10:10:10"
2.使用系統調用settimeofday
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
#include <unistd.h>
static void time_set(int year,int month,int day,int hour,int min,int sec)
{
struct tm tptr;
struct timeval tv;
tptr.tm_year = year - 1900;
tptr.tm_mon = month - 1;
tptr.tm_mday = day;
tptr.tm_hour = hour;
tptr.tm_min = min;
tptr.tm_sec = sec;
tv.tv_sec = mktime(&tptr);
tv.tv_usec = 0;
settimeofday(&tv, NULL);
system(sudo hwclock -w);//將設置好的系統時間寫入到rtc中
}
C語言settimeofday()函數:設置當前時間戳
頭文件:
1 |
#include <sys/time.h> #include <unistd.h> |
定義函數:
1 |
int settimeofday(const struct timeval *tv, const struct timezone *tz); |
函數說明:
settimeofday()會把目前時間設成由tv 所指的結構信息,當地時區信息則設成tz 所指的結構。詳細的說明請參考gettimeofday()。
注意,在Linux下,只有root 權限才能使用此函數修改時間。
返回值:成功則返回0,失敗返回-1,錯誤代碼存於errno。
錯誤代碼:
EPERM 並非由root 權限調用settimeofday(),權限不夠。
EINVAL 時區或某個數據是不正確的,無法正確設置時間。
C語言gettimeofday()函數:獲取當前時間
頭文件:
1 |
#include <sys/time.h> #include <unistd.h> |
定義函數:int gettimeofday (struct timeval * tv, struct timezone * tz);
函數說明:gettimeofday()會把目前的時間有tv 所指的結構返回,當地時區的信息則放到tz 所指的結構中。
timeval 結構定義爲:
1 2 3 4 |
struct timeval{ long tv_sec; //秒 long tv_usec; //微秒 }; |
timezone 結構定義爲:
1 2 3 4 5 |
struct timezone { int tz_minuteswest; //和Greenwich 時間差了多少分鐘 int tz_dsttime; //日光節約時間的狀態 }; |
上述兩個結構都定義在/usr/include/sys/time.h. tz_dsttime 所代表的狀態如下
1 2 3 4 5 6 7 8 9 10 11 |
DST_NONE //不使用 DST_USA //美國 DST_AUST //澳洲 DST_WET //西歐 DST_MET //中歐 DST_EET //東歐 DST_CAN //加拿大 DST_GB //大不列顛 DST_RUM //羅馬尼亞 DST_TUR //土耳其 DST_AUSTALT //澳洲(1986 年以後) |
返回值:成功則返回0,失敗返回-1,錯誤代碼存於errno。
附加說明:EFAULT 指針tv 和tz 所指的內存空間超出存取權限。