原文鏈接:https://www.cnblogs.com/qmfsun/p/4598650.html date "+今天是%Y-%d-%m,現在是%H:%M:%S" 1. 顯示時間date命令可以按照指定格式顯示日期,只鍵入date則以預設格式顯示當前時間。如下: 如果需要以指定的格式顯示日期,可以 ...
原文鏈接:https://www.cnblogs.com/qmfsun/p/4598650.html
date "+今天是%Y-%d-%m,現在是%H:%M:%S"
1. 顯示時間
date命令可以按照指定格式顯示日期,只鍵入date則以預設格式顯示當前時間。如下:
如果需要以指定的格式顯示日期,可以使用“+”開頭的字元串指定其格式,詳細格式如下:
%n : 下一行
%t : 跳格
%H : 小時(00-23)
%I : 小時(01-12)
%k : 小時(0-23)
%l : 小時(1-12)
%M : 分鐘(00-59)
%p : 顯示本地 AM 或 PM
%r : 直接顯示時間 (12 小時制,格式為 hh:mm:ss [AP]M)
%s : 從 1970 年 1 月 1 日 00:00:00 UTC 到目前為止的秒數
%S : 秒(00-60)
%T : 直接顯示時間 (24 小時制)
%X : 相當於 %H:%M:%S
%Z : 顯示時區
%a : 星期幾 (Sun-Sat)
%A : 星期幾 (Sunday-Saturday)
%b : 月份 (Jan-Dec)
%B : 月份 (January-December)
%c : 直接顯示日期與時間
%d : 日 (01-31)
%D : 直接顯示日期 (mm/dd/yy)
%h : 同 %b
%j : 一年中的第幾天 (001-366)
%m : 月份 (01-12)
%U : 一年中的第幾周 (00-53) (以 Sunday 為一周的第一天的情形)
%w : 一周中的第幾天 (0-6)
%W : 一年中的第幾周 (00-53) (以 Monday 為一周的第一天的情形)
%x : 直接顯示日期 (mm/dd/yy)
%y : 年份的最後兩位數字 (00.99)
%Y : 完整年份 (0000-9999)
上述格式不必全都記住,只需要掌握幾個常用的即可。例如%Y表示年,%m表示月,%d表示日,%H表示小時,%M表示分鐘,%S表示秒,%s表示從 1970 年 1 月 1 日 00:00:00 UTC 到目前為止的秒數,相當於time函數,%w表示一周中的第幾天。實例見下:
date "+現在時間是: %Y-%m-%d %H:%M:%S"
date -s "+現在時間是: %Y-%m-%d %H:%M:%S"
如果要顯示的時間不是當前時間,而是經過運算的時間,則可以用-d選項。例如顯示三年前的時間:
看到這個命令我很受傷,過去的時間再也回不去了,只能用命令看看。顯示三個月後的時間:
顯示十天後的時間:
有時候需要獲取當前時間距離1970年0時0分0秒所經歷的秒數,保存在變數中:
2. 設置時間
用 -s選項可以設置系統時間:
方式多種多樣,任你選:
你要足夠相信date的智能。
date命令的常見使用方法總結
由於跨年、跨月、閏平年等特殊性,在日常編程過程中對日期的處理總是異常麻煩。目前,各種編程語言也都要自己的日期函數庫,所以在對日期進行處理前,一定先查查你使用的編程語言有沒有日期函數庫。使用shell編程時,對於日期的使用也總是會或多或少出現在程式中:輸出程式處理時間,處理幾天前的文件,……
在shell中date命令可以來達到我們的需求,在這裡對其常見使用方法進行總結(關於date命令的具體說明可以man date或者date --help,這裡只總結常見用法)。
先看看date的選項:
選項:
-d datestr | --date=datestr: 顯示 datestr 中所設定的時間 (非系統時間)
–help : 顯示輔助訊息
-s datestr | --set=datestr: 將系統時間設為 datestr 中所設定的時間
-u | --utc | --universal: 顯示目前的格林威治時間
–version : 顯示版本編號
其中-d和-s最常使用。
1 獲取當前時間戳
date "+%s" #從1970年1月1日00:00:00到當前的秒數
2 獲取當前日期
date "+%Y-%m-%d" #格式串中不能有空白,如有,請將格式串整體放在雙引號內
預設情況下,在顯示日期和時間時,date命令使用數字0填充數字域。例如,如果用兩位數字顯示月份,則6月顯示為“06”,也可以用下述控制符來控制填充符號。
短線(-):表示不填充數字域。
下劃線(_):表示用空格填充數字域。
例如,命令“date +%d/%m”的輸出為“02/01”;命令“date +%-d/%-m”的輸出為“2/1”;命令“date +_d/%_m”的輸出為“ 1/ 5”。
3 獲得相對日期
相對日期相對當前日期而言。d 選項還可以告訴您,相對於當前日期若幹天的究竟是哪一天,從現在開始的若幹天或若幹星期以後,或者以前(過去)。通過將這個相對偏移使用引號括起來,作為 -d 選項的參數,就可以完成這項任務。
例如,您需要瞭解兩星期以後的日期。如果您處於 Shell 提示符處,那麼可以迅速地得到答案:
$ date -d ’2 weeks’
關於使用該命令,還有其他一些重要的方法:
使用 next/last指令,您可以得到以後的星期幾是哪一天:
$ date -d ‘next monday’ (下周一的日期)
$ date -d next-day +%Y%m%d(明天的日期)或者:date -d tomorrow +%Y%m%d
$ date -d “20110321 next-day” +%Y%m%d(20110321後一天的日期)
$ date -d last-day +%Y%m%d(昨天的日期) 或者:date -d yesterday +%Y%m%d
$ date -d last-month +%Y%m(上個月是幾月)
$ date -d next-month +%Y%m(下個月是幾月)
使用 ago 指令,您可以得到過去的日期:
$ date -d ’30 days ago’ (30天前的日期)
您可以使用負數以得到相反的日期:
$ date -d ‘dec 14 -2 weeks’ (相對:dec 14這個日期的兩周前的日期)
$ date -d ‘-100 days’ (100天以前的日期)
$ date -d ’50 days’(50天後的日期)
4 日期轉時間戳
date -d | --date= ‘yyyy-mm-dd hh:mi:ss’ +%s (日期格式為yyyy-mm-dd hh:mi:ss)
如:date --date="2010-12-03" "+%s" #--date後面接需要轉換的日期
5 時間戳轉日期
date -d ’1970-01-01 UTC time seconds’ +”%Y-%m-%d %T %z” (time為時間戳)
如:date --date="1970-01-01 UTC 1291363421 seconds" "+%Y-%m-%d"
date date --date="@1291363421" 竟然也行!!
6 日期比較大小
(1)比較日期先後最簡單的方法就是直接對日期的字元串進行比較。例如:
if [ "2010-12-31" \< "2011-01-01" ] #註意小於號的轉義
if [[ "2010-12-31" < "2011-01-01" ]] #此時不需要轉義
(2)如果覺得(1)的方法不靠譜,那麼也可以把日期先轉換為時間戳,再進行時間戳的對比。
stamp1=`date --date=$date1 +%s`
stamp2=`date --date=$date2 +%s`
stamp=`expr $stamp2 - $stamp1`
echo $stamp
if [ $stamp -gt 0 ] #大於0
7 獲取指定日期的相對時間
$date -d "20110321 +2 days" (相對20110321兩天後)
$date -d "20110321 +2 weeks" (相對20110321兩周後)
這兩種方式在較早的操作系統中(如RedHat 4U7)可能不支持,需使用next/last指令。
date命令
在linux環境中,不管是編程還是其他維護,時間是必不可少的,也經常會用到時間的運算,熟練運用date命令來表示自己想要表示的時間,肯定可以給自己的工作帶來諸多方便。
1.命令格式:
date [參數]... [+格式]
2.命令功能:
date 可以用來顯示或設定系統的日期與時間。
3.命令參數:
必要參數:
%H 小時(以00-23來表示)。
%I 小時(以01-12來表示)。
%K 小時(以0-23來表示)。
%l 小時(以0-12來表示)。
%M 分鐘(以00-59來表示)。
%P AM或PM。
%r 時間(含時分秒,小時以12小時AM/PM來表示)。
%s 總秒數。起算時間為1970-01-01 00:00:00 UTC。
%S 秒(以本地的慣用法來表示)。
%T 時間(含時分秒,小時以24小時制來表示)。
%X 時間(以本地的慣用法來表示)。
%Z 市區。
%a 星期的縮寫。
%A 星期的完整名稱。
%b 月份英文名的縮寫。
%B 月份的完整英文名稱。
%c 日期與時間。只輸入date指令也會顯示同樣的結果。
%d 日期(以01-31來表示)。
%D 日期(含年月日)。
%j 該年中的第幾天。
%m 月份(以01-12來表示)。
%U 該年中的周數。
%w 該周的天數,0代表周日,1代表周一,異詞類推。
%x 日期(以本地的慣用法來表示)。
%y 年份(以00-99來表示)。
%Y 年份(以四位數來表示)。
%n 在顯示時,插入新的一行。
%t 在顯示時,插入tab。
MM 月份(必要)
DD 日期(必要)
hh 小時(必要)
mm 分鐘(必要)
ss 秒(選擇性)
選擇參數:
-d<字元串> 顯示字元串所指的日期與時間。字元串前後必須加上雙引號。
-s<字元串> 根據字元串來設置日期與時間。字元串前後必須加上雙引號。
-u 顯示GMT。
--help 線上幫助。
--version 顯示版本信息
4.使用說明:
1.在顯示方面,使用者可以設定欲顯示的格式,格式設定為一個加號後接數個標記,其中可用的標記列表如下: % : 列印出 %:
%n : 下一行
%t : 跳格
%H : 小時(00..23)
%I : 小時(01..12)
%k : 小時(0..23)
%l : 小時(1..12)
%M : 分鐘(00..59)
%p : 顯示本地 AM 或 PM
%r : 直接顯示時間 (12 小時制,格式為 hh:mm:ss [AP]M)
%s : 從 1970 年 1 月 1 日 00:00:00 UTC 到目前為止的秒數
%S : 秒(00..61)
%T : 直接顯示時間 (24 小時制)
%X : 相當於 %H:%M:%S
%Z : 顯示時區 %a : 星期幾 (Sun..Sat)
%A : 星期幾 (Sunday..Saturday)
%b : 月份 (Jan..Dec)
%B : 月份 (January..December)
%c : 直接顯示日期與時間
%d : 日 (01..31)
%D : 直接顯示日期 (mm/dd/yy)
%h : 同 %b
%j : 一年中的第幾天 (001..366)
%m : 月份 (01..12)
%U : 一年中的第幾周 (00..53) (以 Sunday 為一周的第一天的情形)
%w : 一周中的第幾天 (0..6)
%W : 一年中的第幾周 (00..53) (以 Monday 為一周的第一天的情形)
%x : 直接顯示日期 (mm/dd/yy)
%y : 年份的最後兩位數字 (00.99)
%Y : 完整年份 (0000..9999)
2.在設定時間方面:
date -s //設置當前時間,只有root許可權才能設置,其他只能查看。
date -s 20080523 //設置成20080523,這樣會把具體時間設置成空00:00:00
date -s 01:01:01 //設置具體時間,不會對日期做更改
date -s “01:01:01 2008-05-23″ //這樣可以設置全部時間
date -s “01:01:01 20080523″ //這樣可以設置全部時間
date -s “2008-05-23 01:01:01″ //這樣可以設置全部時間
date -s “20080523 01:01:01″ //這樣可以設置全部時間
3.加減:
date +%Y%m%d //顯示前天年月日
date +%Y%m%d --date="+1 day" //顯示前一天的日期
date +%Y%m%d --date="-1 day" //顯示後一天的日期
date +%Y%m%d --date="-1 month" //顯示上一月的日期
date +%Y%m%d --date="+1 month" //顯示下一月的日期
date +%Y%m%d --date="-1 year" //顯示前一年的日期
date +%Y%m%d --date="+1 year" //顯示下一年的日期
5.使用實例:
實例1:顯示當前時間
命令:
date
date '+%c'
date '+%D'
date '+%x'
date '+%T'
date '+%X'
輸出:
[root@localhost ~]# date
2012年 12月 08日 星期六 08:31:35 CST
[root@localhost ~]# date '+%c'
2012年12月08日 星期六 08時34分44秒
[root@localhost ~]# date '+%D'
12/08/12[root@localhost ~]# date '+%x'
2012年12月08日
[root@localhost ~]# date '+%T'
08:35:36[root@localhost ~]# date '+%X'
08時35分54秒
[root@localhost ~]#
說明:
實例2:顯示日期和設定時間
命令:
date --date 08:42:00
輸出:
[root@localhost ~]# date '+%c'
2012年12月08日 星期六 08時41分37秒
[root@localhost ~]# date --date 08:42:00
2012年 12月 08日 星期六 08:42:00 CST
[root@localhost ~]# date '+%c' --date 08:45:00
2012年12月08日 星期六 08時45分00秒
[root@localhost ~]#
說明:
實例3:date -d參數使用
命令:
輸出:
[root@localhost ~]# date -d "nov 22"
2012年 11月 22日 星期四 00:00:00 CST
[root@localhost ~]# date -d '2 weeks'
2012年 12月 22日 星期六 08:50:21 CST
[root@localhost ~]# date -d 'next monday'
2012年 12月 10日 星期一 00:00:00 CST
[root@localhost ~]# date -d next-day +%Y%m%d
20121209[root@localhost ~]# date -d tomorrow +%Y%m%d
20121209[root@localhost ~]# date -d last-day +%Y%m%d
20121207[root@localhost ~]# date -d yesterday +%Y%m%d
20121207[root@localhost ~]# date -d last-month +%Y%m
201211[root@localhost ~]# date -d next-month +%Y%m
201301[root@localhost ~]# date -d '30 days ago'
2012年 11月 08日 星期四 08:51:37 CST
[root@localhost ~]# date -d '-100 days'
2012年 08月 30日 星期四 08:52:03 CST
[root@localhost ~]# date -d 'dec 14 -2 weeks'
2012年 11月 30日 星期五 00:00:00 CST
[root@localhost ~]# date -d '50 days'
2013年 01月 27日 星期日 08:52:27 CST
說明:
date 命令的另一個擴展是 -d 選項,該選項非常有用。使用這個功能強大的選項,通過將日期作為引號括起來的參數提供,您可以快速地查明一個特定的日期。-d 選項還可以告訴您,相對於當前日期若幹天的究竟是哪一天,從現在開始的若幹天或若幹星期以後,或者以前(過去)。通過將這個相對偏移使用引號括起來,作為 -d 選項的參數,就可以完成這項任務。
具體說明如下:
date -d "nov 22" 今年的 11 月 22 日是星期三
date -d '2 weeks' 2周後的日期
date -d 'next monday' (下周一的日期)
date -d next-day +%Y%m%d(明天的日期)或者:date -d tomorrow +%Y%m%d
date -d last-day +%Y%m%d(昨天的日期) 或者:date -d yesterday +%Y%m%d
date -d last-month +%Y%m(上個月是幾月)
date -d next-month +%Y%m(下個月是幾月)
使用 ago 指令,您可以得到過去的日期:
date -d '30 days ago' (30天前的日期)
使用負數以得到相反的日期:
date -d 'dec 14 -2 weeks' (相對:dec 14這個日期的兩周前的日期)
date -d '-100 days' (100天以前的日期)
date -d '50 days'(50天後的日期)
實例4:顯示月份和日數
命令:
date '+%B %d'
輸出:
[root@localhost ~]# date '+%B %d'
十二月 08[root@localhost ~]#
說明:
實例5:顯示時間後跳行,再顯示目前日期
命令:
date '+%T%n%D'
輸出:
[root@localhost ~]# date '+%T%n%D'
09:00:30
12/08/12[root@localhost ~]#
說明:
2、舉例date # 以預設格式顯示當前日期
date -d "1 day" # 以預設格式顯示一天後的日期(還可以 second,minute,..直到year,可以加s表示覆數)
date -d "1970-01-01 UTC 1128621784 seconds" # 以預設格式顯示從1970-01-01 UTC起後1128621784秒的日期
date -d "3 day ago" +%Y%m%d # 以指定格式顯示3天前的日期
date -d "1 month" +%Y-%m-%d # 以指定格式顯示一個月後的日期
date -d "1 month" +%s # 以指定格式顯示一個月後的日期(此格式為從1970年1月1日00:00:00到目前經歷的秒數,%S為當前的秒數(0~59))
date -d "1970-01-01 CST 1 second" +%s # 顯示從1970-01-01 CST起1秒後的秒數(-28799,註意時區"CST")
date -d "2 hours" # 2小時前
date -d "1 minutes" # 1分鐘前
date -d "2 seconds" # 2秒鐘前date -d "20120616" +%s # 以指定格式顯示日期
將時間戳轉換成date
#date -d '1970-01-01 UTC 1199116800 seconds'
2008年 01月 01日 星期二 00:00:00 CST
#export
#date -d '19700101 UTC 1199116800 seconds'
Tue Jan 1 00:00:00 CST 2008mi
只輸入date,顯示當前時間
-d 或 --date 用來顯示某個特定日期時間,並且可以格式輸出
好似很簡單的命令,G了一大圈才找到,記下幾種方式供大家借鑒,有好的其他命令歡迎跟貼:
設置系統時間為2007年4月14日13點58分的命令
date -s "20070414 13:58:00"
date -s "2007-04-14 13:58:00"
date -s "2007/04/14 13:58:00"
開始的時候忘記加引號了,暈。
在命令行輸入:
Date:顯示當前時間 Fri Aug 3 14:15:16 CST 2007
date –s:按字元串方式修改時間
可以只修改日期,不修改時間,輸入: date -s 2007-08-03
只修改時間,輸入:date -s 14:15:00
同時修改日期時間,註意要加雙引號,日期與時間之間有一空格,輸入:
#date -s "2007-08-03 14:15:00"
2、查看硬體時間
# hwclock
設置硬體時間
# hwclock -set -date="07/07/06 10:19" (月/日/年 時:分:秒)
3、硬體時間和系統時間的同步
按照前面的說法,重新啟動系統,硬體時間會讀取系統時間,實現同步,但是在不重新啟動的時候,需要用hwclock命令實現同步。
硬體時鐘與系統時鐘同步:
# hwclock --hctosys(hc代表硬體時間,sys代表系統時間)
系統時鐘和硬體時鐘同步:(讓系統的時間同步到硬體時鐘)
# hwclock –systohc
擴展閱讀一:hwclock 使用
Linux機器上的時間比較複雜,有各式各樣的時鐘和選項等等。
一:
機器里有兩個時鐘:硬體時鐘和系統時鐘
硬體時鐘從根本上講是CMOS時鐘;
系統時鐘是由內核維護的,它是從1969年末(即傳說中的標誌Unix時代開端的那個拂曉)開始算起的累積秒數。
在DOS或Mac系統中,起作用的是硬體時鐘。遺憾的是,你可能已經發現了,絕大多數電腦時鐘都是很不准確的。它們從根本上講是由小型電池供電的警報器時鐘,這種鋰電池一般可持續供電三年左右,那時候你系統各大塊差不多都已經過時了。
而在Linux系統中,起作用的是系統時鐘。在啟動時,它靠讀取硬體時鐘獲得計時起點,而不是靠記憶計時。
你可以通過BIOS修改系統硬體時鐘,或者如果你不想重起機器,那就用hwclock命令。
當你使用hwclock命令調整硬體時間很多次以後,hwclock就會獲取你的時鐘推移速率,然後就會把這個信息存在/etc/adjtime裡邊。以後,你就可以用它來隨時更新你的硬體時間,用一條下麵的命令:
hwclock --adjust
硬體時鐘通常被設置成全球標準時間(UTC),而將時區信息保存在/usr/share/lib/timezone (或者在某些系統中可能是/usr/local/timezone)目錄下某個適當的文件中,然後用一個符號鏈接文件/etc/localtime指向它。
查看硬體時鐘用命令:
hwclock --show 或者 hwclock -r
重置硬體時鐘用:
#date 042817252009.00 //設置系統時鐘 2009 年 04 月 28 日 星期四 17:25:00 CST
#hwclock -w
如果需要修改你的時區信息,可以使用tzset命令,如果你系統中沒有這條命令,那可以用類似下麵的操作:
ln -s /etc/localtime /usr/share/zoneinfo/US/Pacific
二:
實例:
板子上電
#date 042817252009.00 //設置系統時鐘 2009 年 04 月 28 日 星期四 17:25:00 CST
#hwclock -w //將系統時鐘寫入硬體時鐘
#hwclock -r //看時間是否在變化
如果沒有出錯, 就已經把2009 年 04 月 28 日 星期四 17:25:00 CST 寫入RTC chip了
為了使系統時間和RTC時間同步,可以在初始化文件中添加命令
hwclock –s
使每次開機時讀取RTC時間,並同步給系統時間。
在根文件系統:usr/etc/rc.local中添加
/sbin/hwclock -s
斷電
等2分鐘在上電
#hwclock -r //看時間是否同步,即使與2分鐘後的時間相同
擴展閱讀二:linux中時間設置date、hwclock、clock
Windows時鐘大家可能十分熟悉了,Linux時鐘在概念上類似Windows時鐘顯示當前系統時間,但在時鐘分類和設置上卻和Windows大相徑庭。和Windows不同的是,Linux將時鐘分為系統時鐘(System Clock)和硬體(Real Time Clock,簡稱RTC)時鐘兩種。系統時間是指當前Linux Kernel中的時鐘,而硬體時鐘則是主板上由電池供電的那個主板硬體時鐘,這個時鐘可以在BIOS的"Standard BIOS Feture"項中進行設置。
既然Linux有兩個時鐘系統,那麼大家所使用的Linux預設使用哪種時鐘系統呢?會不回出現兩種系統時鐘衝突的情況呢?這些疑問和擔心不無道理。首先,Linux並沒有預設哪個時鐘系統。當Linux啟動時,硬體時鐘會去讀取系統時鐘的設置,然後系統時鐘就會獨立於硬體運作。
從Linux啟動過程來看,系統時鐘和硬體時鐘不會發生衝突,但Linux中的所有命令(包括函數)都是採用的系統時鐘設置。不僅如此,系統時鐘和硬體時鐘還可以採用非同步方式,即系統時間和硬體時間可以不同。這樣做的好處對於普通用戶意義不大,但對於Linux網路管理員卻有很大的用處。例如,要將一個很大的網路中(跨越若幹時區)的伺服器同步,假如位於美國紐約的Linux伺服器和北京的Linux伺服器,其中一臺伺服器無須改變硬體時鐘而只需臨時設置一個系統時間,如要將北京伺服器上的時間設置為紐約時間,兩台伺服器完成文件的同步後,再與原來的時鐘同步一下即可。這樣系統和硬體時鐘就提供了更為靈活的操作。
在Linux中,用於時鐘查看和設置的命令主要有date、hwclock和clock。其中,clock和hwclock用法相近,只不過clock命 令除了支持x86硬體體系外,還支持Alpha硬體體系。由於目前絕大多數用戶使用x86硬體體系,所以可以視這兩個命令為一個命令來學習。
1.在虛擬終端中使用date命令來查看和設置系統時間
查看系統時鐘的操作:
# date
設置系統時鐘的操作:
# date 091713272003.30
通用的設置格式:
# date 月日時分年.秒
2.使用hwclock或clock命令查看和設置硬體時鐘
查看硬體時鐘的操作:
# hwclock --show 或
# clock --show
2003年09月17日 星期三 13時24分11秒 -0.482735 seconds
設置硬體時鐘的操作:
# hwclock --set --date="09/17/2003 13:26:00"
或者
# clock --set --date="09/17/2003 13:26:00"
通用的設置格式:hwclock/clock --set --date=“月/日/年時:分:秒”。
3.同步系統時鐘和硬體時鐘
Linux系統(筆者使用的是Red Hat 8.0,其它系統沒有做過實驗)預設重啟後,硬體時鐘和系統時鐘同步。如果不大方便重新啟動的話(伺服器通常很少重啟),使用clock或hwclock命令來同步系統時鐘和硬體時鐘。
硬體時鐘與系統時鐘同步:
# hwclock --hctosys
或者
# clock --hctosys
上面命令中,--hctosys表示Hardware Clock to SYStem clock。
系統時鐘和硬體時鐘同步:
# hwclock --systohc
或者
# clock --systohc
本篇文章來源於 Linux公社網站(www.linuxidc.com) 原文鏈接:http://www.linuxidc.com/Linux/2012-09/69914p2.htm
我使用過的Linux命令之hwclock - 查詢和設置硬體時鐘
本文鏈接:http://codingstandards.iteye.com/blog/804830 (轉載請註明出處)
用途說明
hwclock命令,與clock命令是同一個命令,主要用來查詢和設置硬體時鐘(query and set the hardware clock (RTC))。RTC=Real Time Clock,也就是硬體時鐘。在Linux中有硬體時鐘與系統時鐘等兩種時鐘。硬體時鐘是指主機板上的時鐘設備,也就是通常可在BIOS畫面設定的時鐘。系統時鐘則是指kernel中 的時鐘。所有Linux相關指令與函數都是讀取系統時鐘的設定。因為存在兩種不同的時鐘,那麼它們之間就會存在差異。根據不同參數設置,hwclock命令既可以將硬體時鐘同步到系統時鐘,也可以將系統時鐘同步到硬體時鐘。
關於系統時鐘與硬體時鐘的關係的說法,網上分成了兩種:
第一種:當Linux啟動時,硬體時鐘會去讀取系統時鐘的設置,然後系統時鐘就會獨立於硬體運作。
第二種:當Linux啟動時,系統時鐘會去讀取硬體時鐘的設定,之後系統時鐘即獨立運作。
到底那一種才是正確的呢?執行一下man hwclock可以看到裡面有一段:
man hwclock 寫道
The System Time is the time that matters. The Hardware Clock’s basic purpose in a Linux system is to keep time
when Linux is not running. You initialize the System Time to the time from the Hardware Clock when Linux
starts up, and then never use the Hardware Clock again. Note that in DOS, for which ISA was designed, the
Hardware Clock is the only real time clock.
這段文字說明,第二種說法是正確的,第一種說法是錯誤的。但網上大部分文章都是第一種說法,所以說,網路雖好,要註意甄別。
man hwclock 寫道
It is important that the System Time not have any discontinuities such as would happen if you used the date(1L)
program to set it while the system is running. You can, however, do whatever you want to the Hardware Clock
while the system is running, and the next time Linux starts up, it will do so with the adjusted time from the
Hardware Clock.
如果使用date命令修改了系統時間,並不會自動去修改硬體時鐘,因此,當系統下次重啟時,系統時鐘還會從硬體時鐘去取,date設置的時間就無效了。這大概就是為什麼需要hwclock命令的原因吧。
常用參數
-r, --show 讀取並列印硬體時鐘(read hardware clock and print result )
-s, --hctosys 將硬體時鐘同步到系統時鐘(set the system time from the hardware clock )
-w, --systohc 將系統時鐘同步到硬體時鐘(set the hardware clock to the current system time )
使用示例
示例一 hwclock命令與clock命令是一個東西
[root@new55 ~]# type -a hwclock
hwclock is /sbin/hwclock
hwclock is /usr/sbin/hwclock
[root@new55 ~]# ls -l /sbin/hwclock /usr/sbin/hwclock
-rwxr-xr-x 1 root root 34096 2010-01-07 /sbin/hwclock
lrwxrwxrwx 1 root root 18 08-13 00:14 /usr/sbin/hwclock -> ../../sbin/hwclock
[root@new55 ~]# type -a clock
clock is /sbin/clock
[root@new55 ~]# ls -l /sbin/clock
lrwxrwxrwx 1 root root 7 08-13 00:14 /sbin/clock -> hwclock
[root@new55 ~]#
示例二 顯示硬體時鐘
[root@new55 ~]# hwclock
2010年11月06日 星期六 21時09分28秒 -0.134840 seconds
[root@new55 ~]# hwclock -r
2010年11月06日 星期六 21時09分33秒 -0.469123 seconds
[root@new55 ~]# hwclock --show
2010年11月06日 星期六 21時09分45秒 -0.127548 seconds
[root@new55 ~]#
示例三 修改日期並同步到硬體時鐘
[root@new55 ~]# date
2010年 11月 06日 星期六 21:11:57 CST
[root@new55 ~]# date 11062112 <== 格式 mmddHHMM,即 月日時分
2010年 11月 06日 星期六 21:12:00 CST
[root@new55 ~]# hwclock -w
[root@new55 ~]# hwclock
2010年11月06日 星期六 21時12分13秒 -0.648818 seconds
[root@new55 ~]#
註:要使系統時間準確,最好還是使用ntp方式。
示例四 使用ntpdate命令從網路同步時間,再同步到硬體時鐘
ntpdate命令是使用NTP協議來從網路同步時間的命令。NTP=Network Time Protocol 網路時間協議。
[root@new55 ~]# ntpdate 0.rhel.pool.ntp.org
6 Nov 21:17:55 ntpdate[4829]: step time server 123.146.124.28 offset -1.025258 sec
[root@new55 ~]# date
2010年 11月 06日 星期六 21:17:59 CST
[root@new55 ~]# hwclock -w
[root@new55 ~]#
在Linux中有硬體時鐘與系統時鐘兩種時鐘。硬體時鐘是指主機板上的時鐘設備,也就是通常可在BIOS畫面設定的時鐘。系統時鐘則是指kernel中的時鐘。所有Linux相關指令與函數都是讀取系統時鐘的設定。因為存在兩種不同的時鐘,那麼它們之間就會存在差異。當Linux啟動時,系統時鐘會去讀取硬體時鐘的設定,之後系統時鐘即獨立運作。
用date命令對系統時間進行設置後,並不會去修改硬體時鐘,所以系統重啟後,系統時間還算會去讀取硬體時間,這就是為何date設置失效到原因。
因此,需要在設置系統時間後,將系統時間同步到硬體時鐘。
clock/hwclock:
顯示與設定硬體時鐘(query and set the hardware clock (RTC)),兩個命令相同。RTC=Real Time Clock,也就是硬體時鐘。
命令參數:
-r, --show 讀取並列印硬體時鐘(read hardware clock and print result)
-s, --hctosys 將硬體時鐘同步到系統時鐘(set the system time from the hardware clock)
-w, --systohc 將系統時鐘同步到硬體時鐘(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. 同步系統時間到硬體時鐘
複製代碼
[root@localhost ~]# hwclock
2014年03月27日 星期四 18時50分51秒 -0.312960 seconds
[root@localhost ~]# date
2014年 03月 27日 星期四 10:50:55 CST
[root@localhost ~]# hwclock -w
[root@localhost ~]# hwclock
2014年03月27日 星期四 10時51分15秒 -0.875387 seconds
複製代碼
同步網路時間到系統時間
[root@localhost ~]# ntpdate 210.72.145.44
27 Mar 11:11:24 ntpdate[4766]: adjust time server 210.72.145.44 offset 0.011401 sec
210.72.145.44 (中國西安授時中心的官方時間同步伺服器IP功能變數名稱)
同步網路時間到系統時間後,就可以用hwclock -w將系統時間同步到硬體時間。
修改時區
可能部分系統在執行以上兩步後,在重啟後仍然失效,所以需要進行時區修改。
[root@localhost ~]# tzselect #按照提示進行選擇時區
[root@localhost ~]# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
修改系統時間配置文件
[root@localhost ~]# /etc/sysconfig/clock
#打開clock文件,將相關內容改成以下內容
UTC=true
ARC=false
ZONE="Asia/Shanghai"
重啟系統
[root@localhost ~]# reboot
date +%Y-%m-%d%t%A%t%T 可以固定不過建議 使用 alias 進行設置 而不是去修改預設的date腳本。既alias date='date +%Y-%m-%d%t%A%t%T '要使以後都生效 可以到/etc/bashrc 設置 也可以到用戶目錄下 設置 .bashrc
date +%Y%m%d%t%A%t%T
你可以在在 某個啟動腳本裡面加上下麵這條命令,比如在 /etc/bashrc 腳本裡面,加上
alias date="date \"+%Y-%m-%d %H:%M:%S\""
然後運行改文件,
. /etc/bashrc
date "+%Y-%m-%d %H:%M:%S"