Linux中date、time、clock等時間相關的介紹和使用

  本文將介紹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 指令無法取得這些資料。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章