在寫 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秒,跟測試中結果一致