Linux 下date命令的常見用法


在寫 shell 腳本的時候會經常需要比較時間,根據比較的結果執行不同的邏輯。date是Linux中日期和時間相關的命令,它主要是把時間以指定的格式展示出來,它也是最常用的命令之一

命令和語法

 date [OPTION]... [+FORMAT]

date 的輸出格式比較多,下面列出一些常用的輸出格式

%m : 當前是一年中第幾個月,例如:七月顯示 07

%d : 當前是一個月中第幾天,例如:一個月中第一天顯示 01

%j :當前是一年中第幾天(001到366)

%V : 當前是一年中第幾個星期,每周第一天是周一

%U : 當前是一年中第幾個星期,每周第一天是周日

%w :當前是一個星期中第幾天(1-6 表示周一到周六,0 表示周日)

%z :當前所在時區,比如北京是在 +0800 時區

%s : UTC時間的秒數,從1970-01-01 00:00:00到現在經過的秒數

%Y :當前是哪一年

%M : 當前是一個小時中第幾分鍾

%S :當前是一分鍾中第幾秒

當前所在時區

[root@ecs-centos-7 tt]# date +%z
+0800

UTC時間和日期互相轉換

[root@ecs-centos-7 tt]# date
Mon Jul 27 20:32:46 CST 2020
[root@ecs-centos-7 tt]# date +%s
1595853166

[root@ecs-centos-7 tt]# date -d '@1595853166' '+%F %T'
2020-07-27 20:32:46
[root@ecs-centos-7 tt]# date -d "2020-07-27 20:32:46" +%s
1595853166

上面的例子中,把當前時間轉換成 UTC 的時間,也可以把指定的時間字符串轉換成UTC秒數,還可以把指定的UTC秒數轉換成對應的日期,由此可見UTC時間和日期之間可以互相轉換的

通過時間戳轉換網站把UTC的秒數:1595853166 轉換成具體的日期,轉換結果如下圖:

例子中,當前時間是:2020-07-27 20:32:46 轉化成 UTC 時間的秒數是:1595853166 ,然后再通過時間戳轉換網站來驗證,結果表明兩者的答案是一致的

修改系統時間

只有root用戶才有權限修改系統時間,所以下面的命令需要先切換到root用戶執行,否則會提示沒有執行權限

  • 修改全部的時間
[root@ecs-centos-7 tt]# date -s "20200727 20:42:30"
Mon Jul 27 20:42:30 CST 2020
[root@ecs-centos-7 tt]# date -s "2020-07-27 20:42:30"
Mon Jul 27 20:42:30 CST 2020
  • 只修改時間,不修改年月日
[root@ecs-centos-7 tt]# date
Mon Jul 27 20:43:23 CST 2020
[root@ecs-centos-7 tt]# date -s "20:43:00"
Mon Jul 27 20:43:00 CST 2020
[root@ecs-centos-7 tt]# date
Mon Jul 27 20:43:01 CST 2020
  • 只修改年月日
[root@ecs-centos-7 tt]# date
Mon Jul 27 20:44:51 CST 2020
[root@ecs-centos-7 tt]# date -s "2020-07-28"
Tue Jul 28 00:00:00 CST 2020
[root@ecs-centos-7 tt]# date
Tue Jul 28 00:00:00 CST 2020

[root@ecs-centos-7 tt]# date -s "20200727"
Mon Jul 27 00:00:00 CST 2020
[root@ecs-centos-7 tt]# date
Mon Jul 27 00:00:02 CST 2020

上面的例子展示了兩種修改年月日的方式,需要注意的是:只修改年月日之后,時間默認變成當天的 00:00:00

時間加減

當前時間時 2020-07-27,下面的例子都是以此為基礎時間的

  • 增減分鍾、小時
[root@ecs-centos-7 tt]# date
Mon Jul 27 02:26:00 CST 2020
[root@ecs-centos-7 tt]# date -d '+10 min' '+%F %T'  
2020-07-27 02:36:02
[root@ecs-centos-7 tt]# date -d '-10 min' '+%F %T'   
2020-07-27 02:16:05

Mon Jul 27 02:27:21 CST 2020
[root@ecs-centos-7 tt]#  date -d '+2 hour' '+%F %T'   
2020-07-27 04:27:22
[root@ecs-centos-7 tt]#  date -d '-2 hour' '+%F %T'    
2020-07-27 00:27:26
  • 增減天數
[root@ecs-centos-7 tt]# date -d '+1 day' +%F
2020-07-28
[root@ecs-centos-7 tt]# date -d '-2 day' +%F         
2020-07-25
  • 增減星期
[root@ecs-centos-7 tt]# date -d '+1 week' +%F       
2020-08-03
[root@ecs-centos-7 tt]# date -d '-2 week' +%F     
2020-07-13
  • 增減月份
[root@ecs-centos-7 tt]# date -d '+1 month' +%F   
2020-08-27
[root@ecs-centos-7 tt]# date -d '-2 month' +%F    
2020-05-27
  • 增減年份
[root@ecs-centos-7 tt]# date -d '+1 year' +%F     
2021-07-27
[root@ecs-centos-7 tt]# date -d '-1 year' +%F    
2019-07-27

處理文件中的字符串時間

-f 選項是用來處理文件中時間字符串的,現有 a.txt ,文件內容如下:

[root@ecs-centos-7 tt]# cat a.txt 
2020-07-27 20:03:00
2020-07-26 20:04:00
2020-07-25 20:05:00

把文件中每一行的時間轉化成UTC時間,輸出如下:

[root@ecs-centos-7 tt]# date -f a.txt +%s
1595851380
1595765040
1595678700

腳本中計算時間差

通常在shell腳本中需要計算出兩個時間變量的差值, 我們可以通過把時間字符串轉化成 UTC 的秒數來計算時間差,下面是 test.sh 的腳本內容

#!/bin/bash

starttime=`date +%s`
echo "process logic..."
sleep 5s
endtime=`date +%s`
diff=$((endtime - starttime))
echo "starttime:${starttime}, endtime:${endtime}, diff:"${diff}

上面是一段簡單的測試腳本,腳本開始記錄當前時間,然后用睡眠5秒來表示執行邏輯花費了5秒,邏輯執行完后,再次記錄下結束時間,打印出開始、結束以及時間差

執行 ./test.sh,輸出如下:

[root@ecs-centos-7 ~]# ./test.sh 
process logic...
starttime:1595790297, endtime:1595790302, diff:5

上面的輸出中,結束時間和開始時間差是5秒,表示腳本執行花費的時間是5秒,跟測試中結果一致


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM