在Linux中有硬件時鐘與系統(tǒng)時鐘兩種時鐘。硬件時鐘是指主機板上的時鐘設(shè)備,也就是通??稍贐IOS畫面設(shè)定的時鐘。系統(tǒng)時鐘則是指kernel中的時鐘。所有Linux相關(guān)指令與函數(shù)都是讀取系統(tǒng)時鐘的設(shè)定。因為存在兩種不同的時鐘,那么它們之間就會存在差異。當(dāng)Linux啟動時,系統(tǒng)時鐘會去讀取硬件時鐘的設(shè)定,之后系統(tǒng)時鐘即獨立運作。
堅守“ 做人真誠 · 做事靠譜 · 口碑至上 · 高效敬業(yè) ”的價值觀,專業(yè)網(wǎng)站建設(shè)服務(wù)10余年為成都成都PVC花箱小微創(chuàng)業(yè)公司專業(yè)提供成都定制網(wǎng)頁設(shè)計營銷網(wǎng)站建設(shè)商城網(wǎng)站建設(shè)手機網(wǎng)站建設(shè)小程序網(wǎng)站建設(shè)網(wǎng)站改版,從內(nèi)容策劃、視覺設(shè)計、底層架構(gòu)、網(wǎng)頁布局、功能開發(fā)迭代于一體的高端網(wǎng)站建設(shè)服務(wù)。
用date命令對系統(tǒng)時間進行設(shè)置后,并不會去修改硬件時鐘,所以系統(tǒng)重啟后,系統(tǒng)時間還算會去讀取硬件時間,這就是為何date設(shè)置失效到原因。
因此,需要在設(shè)置系統(tǒng)時間后,將系統(tǒng)時間同步到硬件時鐘。
clock/hwclock:
顯示與設(shè)定硬件時鐘(query and set the hardware clock (RTC)),兩個命令相同。RTC=Real Time Clock,也就是硬件時鐘。
命令參數(shù):
-r, --show ? ? ? ?讀取并打印硬件時鐘(read hardware clock and print result)-s, --hctosys ? ? 將硬件時鐘同步到系統(tǒng)時鐘(set the system time from the hardware clock)-w, --systohc ? ? 將系統(tǒng)時鐘同步到硬件時鐘(set the hardware clock to the current system time)
命令示例:
1. 查看硬件時鐘
2014年03月27日 星期四 11時03分50秒? -0.328520 seconds
[root@localhost ~]# hwclock -r
2014年03月27日 星期四 11時03分53秒? -0.797264 seconds
[root@localhost ~]# hwclock --show
2014年03月27日 星期四 11時04分01秒? -0.672267 seconds
2. clock與hwclock相同
[root@localhost ~]# type -a hwclock
hwclock is /sbin/hwclock
hwclock is /usr/sbin/hwclock
[root@localhost ~]# ll /sbin/hwclock /usr/sbin/hwclock
-rwxr-xr-x. 1 root root 46940 11月 22 23:27 /sbin/hwclock
lrwxrwxrwx. 1 root root ? ?18 3月 ?26 19:27 /usr/sbin/hwclock - ../../sbin/hwclock
[root@localhost ~]# type -a clock
clock is /sbin/clock
[root@localhost ~]# ll /sbin/clock
lrwxrwxrwx. 1 root root 7 3月 ?26 19:27 /sbin/clock - hwclock
3. 同步系統(tǒng)時間到硬件時鐘
[root@localhost ~]# hwclock2014年03月27日 星期四 18時50分51秒 ?-0.312960 seconds
[root@localhost ~]# date
2014年 03月 27日 星期四 10:50:55 CST
[root@localhost ~]# hwclock -w
[root@localhost ~]# hwclock2014年03月27日 星期四 10時51分15秒 ?-0.875387 seconds
同步網(wǎng)絡(luò)時間到系統(tǒng)時間
[root@localhost ~]# ntpdate 210.72.145.4427 Mar 11:11:24 ntpdate[4766]: adjust time server 210.72.145.44 offset 0.011401 sec
210.72.145.44?(中國西安授時中心的官方時間同步服務(wù)器IP域名)
同步網(wǎng)絡(luò)時間到系統(tǒng)時間后,就可以用hwclock -w將系統(tǒng)時間同步到硬件時間。
修改時區(qū)
可能部分系統(tǒng)在執(zhí)行以上兩步后,在重啟后仍然失效,所以需要進行時區(qū)修改。
[root@localhost ~]# tzselect #按照提示進行選擇時區(qū)
[root@localhost ~]# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
修改系統(tǒng)時間配置文件
[root@localhost ~]# /etc/sysconfig/clock
#打開clock文件,將相關(guān)內(nèi)容改成以下內(nèi)容
UTC=false
ARC=false
ZONE="Asia/Shanghai"
重啟系統(tǒng)
[root@localhost ~]# reboot
// 用進程調(diào)用命令QProcessQString strDateTime = "2016-10-23 10:55:55";// 格式請按照上面格式輸入。 QProcess::execute("data", QStringList()
系統(tǒng)時間一般是保存在時鐘寄存器中的,由于絕對時間值比較大,所以寄存器中都是放一個相對時間值,即系統(tǒng)時間(日期+時間)減去一個固定的值(多數(shù)是1900年,也有的用1970年)后的秒數(shù)。取系統(tǒng)時間時會再把這個值加回來,從而得到真正的系統(tǒng)時間。
uboot中取時間的函數(shù)是將時鐘寄存器中的值取出后,加上那個固定值(如1900年),直接返回,如果時間寄存器中放的是12年的秒數(shù),在u-boot中就會顯示是1912年。
linux kernel計算日期中有點不同,在算出年號后(加上1900年),接著判斷,年號=1969,再加上100,所以同樣時間寄存器值將會校正為2012了。
你的系統(tǒng)顯示不一致,可能原因是u-boot和kernel源代碼移植不完整,u-boot和kernel實時時鐘的存儲和計算策略不一致。