本文將介紹linux中date命令的使用和技巧,列舉了如參數、輸出、設置、轉換、時間戳等,示例並對注意點進行了說明。
本文也介紹了系統時間和硬件時間的區別,另外,對於time命令也進行了簡單的說明。
date命令
date -help亦可查看。
命令功能
Linux系統裏自帶的一個系統命令,可以以給定的格式顯示當前時間,或是設置系統日期。
命令格式
在date命令中,默認顯示的結果裏包括很多信息,特別是做爲文件名輸出時,不是很方便,但好在裏包含格式化輸出的選項:
date [OPTION]... [+FORMAT]
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
常用參數
如果命令沒有帶任何參數時,則默認顯示系統當期時間,輸出時間爲:格林威治時間,並把日期和時間按CST格式輸出。
-d, --date=STRING
顯示由 STRING 指定的時間, 而不是當前時間
-f, --file=DATEFILE
顯示 DATEFILE 中每一行指定的時間, 如同將 DATEFILE 中的每行作爲 --date 的參數一樣
-I[FMT], --iso-8601[=FMT]
按照 ISO-8601 的日期/時間格式輸出時間.
FMT=`date' (或者不指定時)僅輸出日期,等於 `hours', `minutes', 或`seconds' 時按照指定精度輸出日期及時間.
-r, --reference=FILE
顯示 FILE 的最後修改時間
-R, --rfc-822
根據 RFC-822 指定格式輸出日期
-s, --set=STRING
根據 STRING 設置時間
-u, --utc, --universal
顯示或設置全球時間(格林威治時間)
--help
顯示本幫助文件並退出
--version
顯示版本信息並退出
格式 FORMAT 控制着輸出格式. 僅當選項指定爲全球時間時本格式纔有效。 分別解釋如下:
%% 文本的 %
%a 當前區域的星期幾的簡寫 (Sun..Sat)
%A 當前區域的星期幾的全稱 (不同長度) (Sunday..Saturday)
%b 當前區域的月份的簡寫 (Jan..Dec)
%B 當前區域的月份的全稱(變長) (January..December)
%c 當前區域的日期和時間 (Sat Nov 04 12:02:33 EST 1989)
%d (月份中的)幾號(用兩位表示) (01..31)
%D 日期(按照 月/日期/年 格式顯示) (mm/dd/yy)
%e (月份中的)幾號(去零表示) ( 1..31)
%h 同 %b
%H 小時(按 24 小時制顯示,用兩位表示) (00..23)
%I 小時(按 12 小時制顯示,用兩位表示) (01..12)
%j (一年中的)第幾天(用三位表示) (001..366)
%k 小時(按 24 小時制顯示,去零顯示) ( 0..23)
%l 小時(按 12 小時制顯示,去零表示) ( 1..12)
%m 月份(用兩位表示) (01..12)
%M 分鐘數(用兩位表示) (00..59)
%n 換行
%N 納秒 (000000000..999999999)
%p 當前時間是上午 AM 還是下午 PM
%r 時間,按 12 小時制顯示 (hh:mm:ss [A/P]M)
%s 從 1970年1月1日0點0分0秒到現在歷經的秒數 (GNU擴充)
%S 秒數(用兩位表示)(00..60)
%t 水平方向的 tab 製表符
%T 時間,按 24 小時制顯示(hh:mm:ss)
%U (一年中的)第幾個星期,以星期天作爲一週的開始(用兩位表示) (00..53)
%V (一年中的)第幾個星期,以星期一作爲一週的開始(用兩位表示) (01..52)
%w 用數字表示星期幾 (0..6); 0 代表星期天
%W (一年中的)第幾個星期,以星期一作爲一週的開始(用兩位表示) (00..53)
%x 按照 (mm/dd/yy) 格式顯示當前日期
%X 按照 (%H:%M:%S) 格式顯示當前時間
%y 年的後兩位數字 (00..99)
%Y 年(用 4 位表示) (1970...)
%z 按照 RFC-822 中指定的數字時區顯示(如, -0500) (爲非標準擴充)
%Z 時區(例如, EDT (美國東部時區)), 如果不能決定是哪個時區則爲空
默認情況下,日期的數字區域以0 填充,比如2020年02月16日會表示成2020-02-16。
以下可選標記可以跟在"%"後:
- (連字符) 不填充該域
_ (下劃線) 以空格填充
0 (數字0)以0 填充
^ 如果可能,使用大寫字母
# 如果可能,使用相反的大小寫
在任何標記之後還允許一個可選的域寬度指定,它是一個十進制數字。
作爲一個可選的修飾聲明,它可以是E,在可能的情況下使用本地環境關聯的
表示方式;或者是O,在可能的情況下使用本地環境關聯的數字符號。
輸出系統時間
#默認顯示,等同於:date -u 。 Sun Feb 16 18:33:00 CST 2020
date
#輸出指定格式: YYYY/MM/DD hh:mm:ss.zzzzzzzzz 2020/02/16 18:36:57.324679800
date '+%Y/%m/%d %H:%M:%S.%N'
# 輸出完整日期和時間,等同於 “ %Y-%m-%d %H:%M:%S” 2020-02-17 18:46:55
date "+%F %T"
注意1:若是 不以 加號作爲開頭,則表示要設定時間,而時間格式爲 MMDDhhmm[[CC]YY][.ss]。其中 MM 爲月份,DD 爲日,hh 爲小時,mm 爲分鐘,CC 爲年份前兩位數字,YY 爲年份後兩位數字,ss 爲秒數。
注意2:當不希望出現無意義的 0 時(比如說 1999/03/07),則可以在標記中插入 - 符號。比如說 date '+%-H:%-M:%-S' 會把時分秒中無意義的 0 給去掉,像是原本的 08:09:04 會變爲 8:9:4。
設置系統時間
#設置完整的時間
date -s "2020-02-16 18:24:34"
date -s "18:24:34 2020-02-16"
#設置日期,由於沒有設置時間,所以時間都是00:00:00
date -s "2020-02-17"
date -s "20200216"
#設置具體時間,不會對日期做更改
date -s "01:01:01"
注意:設置時間時,不支持毫秒、微秒、納秒的設置,只支持秒級別。
時間轉換操作
需使用:-d 參數,可將指定的時間字符串,按照指定的格式輸出(並不會改動系統時間)。
# 轉換指定日期爲Unix時間戳:
date -d “'2020-02-16 18:35:05' +%s"
Unix時間戳轉換爲日期時間:
date -d "@1581849305" "+%Y-%m-%d %H:%M:%S"
注意1:秒點時,參數前面一定要帶上 @ 參數。
注意2:數據轉換照樣只支持秒點級別以上的計算。
時間戳、秒點、微秒、毫秒和納秒
Unix時間戳(英文爲Unix epoch, Unix time, POSIXme 或 Unix timestamp),是指從1970年1月1日(UTC/GMT的午夜)開始所經過的秒數,不考慮閏秒。
date 命令可以直接把當前時間轉化爲時間戳,方法:date "+%s" 。帶上 -d 參數,還可以實現指定日期和秒點之間的轉換。
date 命令亦可以獲取當前時間的納秒,方法:date "+%N"。
如此,我們就可以進行相應的計算,得到對於的微秒、毫秒和納秒數。
#當前系統時間轉換爲時間戳
date "+%s"
#當前系統時間納秒數
date "+%s"
#當前系統時間納秒點
date "+%s%N"
#當前系統時間微秒點
expr $(date "+%s%N") / 1000
#當前系統時間毫秒點
expr $(date "+%s%N") / 1000000
時間加減運算
藉助 -d 或是 --date 參數,。或是先將指定的時間轉換爲秒點,再用 expr 命令 對其計算。
date -d last-day "+%F %T"
date -d yesterday "+%F %T"
date -d next-month "+%F %T"
date -d next-year "+%F %T"
date -d "5 days ago" "+%F %T"
date -d week "+%F %T"
date -d "Nov 12 - 2 days" "+%F %T"
date -d "12/12 - 2 days" "+%F %T"
date -d "2 days" "+%F %T"
date -d "-1day" +%F
date -d "+2hour 2min 2sec" +%F\ %H:%M:%S
系統時區
常用的時區取值有:
- UTC (Universal Time Coordinated,UTC)世界協調時間
- CST (China Standard Time UTC+8:00)中國沿海時間(北京時間)
- GMT (Greenwich Mean Time)格林威治標準時間
所以相關計算時候,一定要特別注意,是否加上UTC時間秒點:8 * 60 * 60 = 28,800。
date默認輸出時,使用的本地時間,即CST:Sun Feb 16 18:26:58 CST 2020。
如果需要查看當前時區時間,帶上 -R 參數: date -R :Sun, 16 Feb 2020 18:27:12 +0800
系統時間與硬件時間
linux系統時鐘有兩個,一個是硬件時鐘(Real Time Clock),叫RTC,即BIOS時間,就是我們進行CMOS設置時看到的時間。另一個是系統時鐘(System clock),也叫內核時鐘或者軟件時鐘,是linux系統Kernel時間。
當Linux啓動時,系統Kernel會去讀取硬件時鐘的設置,然後系統時鐘就會獨立於硬件運作,是由軟件根據時間中斷來進行計數的,內核時鐘在系統關機的情況下是不存在的。並且在系統關機的時,會將系統時間寫回RTC中進行同步。
所以,爲了保持系統時間與CMOS時間的一致性,Linux每隔一段時間會將系統時間寫入CMOS。
由於該同步是每隔一段時間(大約是11分鐘)進行的,在我們執行date -s後,如果馬上重起機器,修改時間就有可能沒有被寫入CMOS,這就是問題的原因。如果要確保修改生效可以執行命令: clock –w。這個命令強制把系統時間寫入CMOS。
#查看硬件時間
hwclock --show
clock --show
#設置硬件時間
hwclock --set --date="2020-02-17 18:30:00"
clock --set --date="2020-02-17 18:30:00"
#同步時間到shell
hwclock
#同步互聯網時間
ntpdate time.windows.com
#硬件時鐘與系統時鐘同步(hc代表硬件時間,sys代表系統時間):
hwclock --hctosys
clock --hctosys
#系統時鐘和硬件時鐘同步:
hwclock --systohc
clock --systohc
time命令
常用於測量一個指令執行時所需消耗的時間及系統資源等資訊,例如 CPU 時間、記憶體、輸入輸出等等。
所以這裏不再多講。
注意1:本命令不是用來顯示和修改系統時間的(這是date命令乾的事情)。
注意2:部分資訊在 Linux 上會顯示不出來。這是因爲在 Linux 上部分資源的分配函式與 time 指令所預設的方式並不相同,以致於 time 指令無法取得這些資料。