成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊聊 Shell 腳本中的日期運算

開發 前端
平常寫shell腳本的過程中,經常要用到日期的運算,比如:日期的加減、與UTC時間換算,比較大小等等,下面就來聊一聊這些常用的日期運算

 [[348597]]

本文轉載自微信公眾號「Linux開發那些事兒」,作者 LinuxThings   。轉載本文請聯系Linux開發那些事兒公眾號。

平常寫shell腳本的過程中,經常要用到日期的運算,比如:日期的加減、與UTC時間換算,比較大小等等,下面就來聊一聊這些常用的日期運算

日期加減

  • 秒增減
  1. [root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "70 second 2020-10-20 12:00:00" 
  2. 2020-10-20 12:01:10 
  3. [root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "-70 second 2020-10-20 12:00:00" 
  4. 2020-10-20 11:58:50 
  • 分鐘增減
  1. [root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "10 minute 2020-10-20 12:00:00" 
  2. 2020-10-20 12:10:00 
  3. [root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "-10 minute 2020-10-20 12:00:00" 
  4. 2020-10-20 11:50:00 
  • 小時增減
  1. [root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "1 hour 2020-10-20 12:00:00" 
  2. 2020-10-20 13:00:00 
  3. [root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "-1 hour 2020-10-20 12:00:00" 
  4. 2020-10-20 11:00:00 
  • 天增減
  1. [root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "3 day 2020-10-20 12:00:00" 
  2. 2020-10-23 12:00:00 
  3. [root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "-3 day 2020-10-20 12:00:00" 
  4. 2020-10-17 12:00:00 
  • 周增減
  1. [root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "1 week 2020-10-20 12:00:00" 
  2. 2020-10-27 12:00:00 
  3. [root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "-1 week 2020-10-20 12:00:00" 
  4. 2020-10-13 12:00:00 
  • 月增減
  1. [root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "2 month 2020-10-20 12:00:00" 
  2. 2020-12-20 12:00:00 
  3. [root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "-2 month 2020-10-20 12:00:00" 
  4. 2020-08-20 12:00:00 
  • 年增減
  1. [root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "1 year 2020-10-20 12:00:00" 
  2. 2021-10-20 12:00:00 
  3. [root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "-1 year 2020-10-20 12:00:00" 
  4. 2019-10-20 12:00:00 
  • 年月日時分秒增減

年月日時分秒除了每一個單獨進行日期增減之外,還可以一起使用

  1. [root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "1 year 2 month 1 week 3 hour -10 minute 40 second 2020-10-20 12:00:00" 
  2. 2021-12-27 14:50:40 
  • 一個月中第幾天
  1. [root@ecs-centos-7 ~]# date +%Y%m%d 
  2. 20201023 
  3. [root@ecs-centos-7 ~]# date +%d 
  4. 23 
  5. [root@ecs-centos-7 ~]# date +%d -d "20201013" 
  6. 13 

date +%d 命令是計算當前日期( 2020年10月23日 ) 是一個月中的第幾天

date +%d -d "20201013" 命令是計算 2020年10月13日 是一個月中第幾天

  • 一年中第幾周
  1. [root@ecs-centos-7 ~]# date +%Y%m%d 
  2. 20201023 
  3. [root@ecs-centos-7 ~]# date +%V 
  4. 43 
  5. [root@ecs-centos-7 ~]# date +%V -d "20201005" 
  6. 41 

上面例子中, date +%V 命令是計算當前日期是一年中第幾周,星期一是一周的第一天,取值范圍是 01-53,date +%V -d "20201005" 命令是計算指定日期 ( 20201005 ) 是一年中第幾周

  • 一周中第幾天
  1. [root@ecs-centos-7 ~]# date +%Y%m%d 
  2. 20201023 
  3. [root@ecs-centos-7 ~]# date +%u 
  4. [root@ecs-centos-7 ~]# date +%u -d "20201004" 

上面的例子中,date +%u 命令是計算當前日期是一周中第幾天,取值范圍是 1 - 7,分別表示周一至周日,結果是 5,表示當前這一天是周五, date +%u -d "20201004" 命令是計算指定日期 ( 20201004 ) 是一周中第幾天,結果是 7 ,表示 2020年10月4日是周日

  1. [root@ecs-centos-7 ~]# date +%Y%m%d 
  2. 20201023 
  3. [root@ecs-centos-7 ~]# date +%w 
  4. [root@ecs-centos-7 ~]# date +%w -d "20201004" 

上面例子中,date +%w 命令是也是計算當前日期是一周中第幾天,取值范圍是 0 - 6 , 0 代表周日,1 - 6 分別代表周一至周六

命令 date +%w -d "20201004" 是計算指定日期 ( 20201004 ) 是一周中第幾天,結果是 0,表示2020年10月4日是周日

月第一天和月最后一天

  1. [root@ecs-centos-7 ~]# date +"%Y-%m-%d"  -d  "-$(($(date +%d -d '2020-10-20') -1 )) days  2020-10-20" 
  2. 2020-10-01 
  3.  
  4. [root@ecs-centos-7 ~]# date +"%Y-%m-%d"  -d  "-$(($(date +%d -d '2020-10-20') )) days +1 month  2020-10-20" 
  5. 2020-10-31 

上面例子中,date +"%Y-%m-%d" -d "-$(($(date +%d -d '2020-10-20') -1 )) days 2020-10-20" 命令是計算日期 2020-10-20 中月份的第一天, 結果是 2020-10-01

命令 date +"%Y-%m-%d" -d "-$(($(date +%d -d '2020-10-20') )) days +1 month 2020-10-20" 是計算日期 2020-10-20 中月份的最后一天, 結果是 2020-10-31

日期和UTC時間互相轉換

  • 日期轉 UTC 時間

UTC時間是整數,把日期轉成UTC時間,更方便各種計算

  1. [root@ecs-centos-7 ~]# date +%s 
  2. 1603443806 
  3. [root@ecs-centos-7 ~]# date +%s -d "2020-10-20 12:00:00" 
  4. 1603166400 
  5. [root@ecs-centos-7 ~]# date +%s -d "2020-10-20 00:00:00" 
  6. 1603123200 
  7. [root@ecs-centos-7 ~]# date +%s -d "2020-10-20" 
  8. 1603123200 
  9. [root@ecs-centos-7 ~]# date +%s -d "2020-10-01" 
  10. 1601481600 

上面例子中,date +%s 命令是把當前時間轉成 UTC 時間,date +%s -d "2020-10-20 12:00:00" 命令是把 2020-10-20 12:00:00 轉成UTC時間

  • UTC時間轉日期
  1. [root@ecs-centos-7 ~]# date +%s -d "2020-10-20 12:00:00" 
  2. 1603166400 
  3. [root@ecs-centos-7 ~]# date -d "@1603166400" 
  4. 2020年 10月 20日 星期二 12:00:00 CST 

命令 date +%s -d "2020-10-20 12:00:00" 是計算 2020-10-20 12:00:00 的UTC時間,這里主要是為了和后面UTC時間轉日期做對比用的

命令 date -d "@1603166400" 是計算UTC時間( 1603166400 ) 對應的日期,計算結果是 2020年 10月 20日 星期二 12:00:00 CST 前一條命令的日期參數是一致的

日期比較大小

shell中直接比較日期相當于字符串比較,可以先把日期轉成UTC時間再進行比較,下面是一個日期比較的測試腳本 ( t.sh ),執行時需要傳入兩個待比較的日期

  1. #!/bin/bash 
  2.  
  3. date1=$(date +%s -d "$1"
  4. date2=$(date +%s -d "$2"
  5.  
  6. if [[ ${date1} -lt ${date2} ]]; then 
  7.     echo " $1  <  $2 " 
  8. elif [[ ${date1} -eq ${date2} ]]; then 
  9.     echo " $1  =  $2 " 
  10. else 
  11.     echo " $1  >  $2 " 
  12. fi 

執行測試腳本,具體結果如下:

  1. [root@localhost shell_test]# ./t.sh "20201020" "20201020" 
  2.  20201020  =  20201020  
  3. [root@localhost shell_test]# ./t.sh "20201020" "20201021" 
  4.  20201020  <  20201021  
  5. [root@localhost shell_test]# ./t.sh "20201020" "20201019" 
  6.  20201020  >  20201019  
  7.  [root@localhost shell_test]#  
  8.   
  9. [root@localhost shell_test]# ./t.sh "2020-10-20 00:00:01" "2020-10-20 00:00:00" 
  10.  2020-10-20 00:00:01  >  2020-10-20 00:00:00  
  11. [root@localhost shell_test]# ./t.sh "2020-10-20 00:00:01" "2020-10-20 00:00:01" 
  12.  2020-10-20 00:00:01  =  2020-10-20 00:00:01  
  13. [root@localhost shell_test]# ./t.sh "2020-10-20 00:00:01" "2020-10-20 00:00:10" 
  14.  2020-10-20 00:00:01  <  2020-10-20 00:00:10  
  15. [root@localhost shell_test]# 

從結果可以看出, t.sh 腳本傳入日期參數既可以只有年月日又可以年月日時分秒都有,而且日期的格式既可以是 20201020 格式,又可以是 2020-10-20 00:00:00 格式的

日期循環遍歷

在工作中,經常要處理一段時間內的日志,需要遍歷日期,然后對每天的日志做處理,下面的測試腳本 ( t.sh ) 是測試日期遍歷的, 腳本內容如下:

  1. #!/bin/bash 
  2.  
  3.  
  4. #開始日期 
  5. begindate=$1 
  6. #結束日期 
  7. enddate=$2 
  8.  
  9. #后一天日期,用于循環 
  10. nextdate=${begindate} 
  11. #后一天日期的utc時間,用于比較日期 
  12. nextutc=$(date +%s -d "${nextdate}"
  13. #結束日期的UTC時間 
  14. endutc=$(date +%s -d "${enddate}"
  15.  
  16.  
  17. while [ ${nextutc} -le ${endutc} ] 
  18. do 
  19.     echo "process ${nextdate} log..." 
  20.     #計算后一天的日期 
  21.     nextdate=$(date -d "${nextdate} 1 day" +%Y%m%d) 
  22.     #計算后一天日期的utc時間 
  23.     nextutc=$(date +%s -d "${nextdate}"
  24.      
  25. done 

執行測試腳本,具體結果如下:

  1. [root@localhost shell_test]# ./t.sh "20201020" "20201023" 
  2. process 20201020 log... 
  3. process 20201021 log... 
  4. process 20201022 log... 
  5. process 20201023 log... 
責任編輯:武曉燕 來源: Linux開發那些事兒
相關推薦

2022-10-17 08:22:28

2021-10-11 09:41:20

React位運算技巧前端

2020-12-16 08:51:31

Shell腳本用途

2021-05-11 07:50:31

BashShell腳本

2022-08-30 08:52:04

shell腳本Linux

2023-07-31 08:45:10

Shell腳本

2019-11-07 23:48:12

shell腳本getopts

2016-12-16 09:23:29

LinuxShell腳本

2023-08-02 11:39:21

SSL證書過期

2023-11-09 11:56:28

MySQL死鎖

2021-08-31 07:54:24

SQLDblink查詢

2024-04-26 00:00:00

Rust檢查器代碼

2021-11-17 08:11:35

MySQL

2024-11-27 09:19:25

2021-08-20 10:46:25

Shell腳本文件Linux

2021-04-21 08:03:34

腳本Shell讀取

2019-08-09 13:50:08

shellLinux

2021-05-12 10:17:15

Shell工具Linux

2013-09-04 09:59:49

監控 Shell 腳本

2022-10-20 17:40:47

GroovyJuelJava
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 先锋资源亚洲 | 成人免费xxxxx在线视频 | 尤物在线| 亚洲国产精品一区二区第一页 | 国产精品一二三区 | 97视频精品| 国产伦精品一区二区三毛 | 久久国产精品久久久久 | 久久夜视频 | 日韩一区二区在线视频 | 羞羞的视频免费在线观看 | 国产综合第一页 | 国产免费又色又爽又黄在线观看 | 日韩欧美国产不卡 | 激情六月丁香婷婷 | 免费a网 | 国产精品无 | 久久久久久国产精品免费免费狐狸 | 久久青青| 国产精品久久久久久久久久久免费看 | 久久精品小视频 | 久草新在线 | 国产九九精品 | 久久69精品久久久久久久电影好 | 一区二区在线不卡 | 福利视频一区二区 | 国产96色在线 | 久久精品中文字幕 | 国产成人精品免高潮在线观看 | 黄色成人在线观看 | 91成人在线| 亚洲日韩中文字幕一区 | 伊人影院99| 91亚洲视频在线 | 91久久北条麻妃一区二区三区 | 免费视频99| 精产国产伦理一二三区 | 日日夜夜精品视频 | 正在播放亚洲 | 欧美久久一级 | 人人擦人人 |