当前位置: 首页 > 科技观察

谈谈shell脚本中的日期计算

时间:2023-03-21 21:30:28 科技观察

本文转载自微信公众号《Linux开发那些事儿》,作者LinuxThings。转载此文请联系Linux开发那些事公众号.在写shell脚本的过程中,经常会用到日期的计算,比如:日期加减、UTC时间转换、大小比较等,下面就说说这些常用的日期计算吧日期加减秒增减[root@ecs-centos-7~]#date+'%Y-%m-%d%H:%M:%S'-d"70second2020-10-2012:00:00"2020-10-2012:01:10[root@ecs-centos-7~]#date+'%Y-%m-%d%H:%M:%S'-d"-70second2020-10-2012:00:00"2020-10-2011:58:50分钟变化[root@ecs-centos-7~]#date+'%Y-%m-%d%H:%M:%S'-d"10minute2020-10-2012:00:00"2020-10-2012:10:00[root@ecs-centos-7~]#date+'%Y-%m-%d%H:%M:%S'-d"-10minute2020-10-2012:00:00"2020-10-2011:50:00小时更改[root@ecs-centos-7~]#date+'%Y-%m-%d%H:%M:%S'-d"1hour2020-10-2012:00:00"2020-10-2013:00:00[root@ecs-centos-7~]#date+'%Y-%m-%d%H:%M:%S'-d"-1hour2020-10-2012:00:00"2020-10-2011:00:00日增减[root@ecs-centos-7~]#date+'%Y-%m-%d%H:%M:%S'-d"3day2020-10-2012:00:00"2020-10-2312:00:00[root@ecs-centos-7~]#date+'%Y-%m-%d%H:%M:%S'-d"-3day2020-10-2012:00:00"2020-10-1712:00:00每周增减[root@ecs-centos-7~]#date+'%Y-%m-%d%H:%M:%S'-d"1week2020-10-2012:00:00"2020-10-2712:00:00[root@ecs-centos-7~]#date+'%Y-%m-%d%H:%M:%S'-d"-1week2020-10-2012:00:00"2020-10-1312:00:00每月增减[root@ecs-centos-7~]#date+'%Y-%m-%d%H:%M:%S'-d"2month2020-10-2012:00:00"2020-12-2012:00:00[root@ecs-centos-7~]#date+'%Y-%m-%d%H:%M:%S'-d"-2month2020-10-2012:00:00"2020-08-2012:00:00年增减[root@ecs-centos-7~]#date+'%Y-%m-%d%H:%M:%S'-d"1year2020-10-2012:00:00"2021-10-2012:00:00[root@ecs-centos-7~]#date+'%Y-%m-%d%H:%M:%S'-d"-1year2020-10-2012:00:00"2019-10-2012:00:00年月日,hour,minute,second,year,month,day时分秒也可以一起使用[root@ecs-centos-7~]#date+'%Y-%m-%d%H:%M:%S'-d"1year2month1week3hour-10minute40second2020-10-2012:00:00"2021-12-2714:50:40本月第几天[root@ecs-centos-7~]#date+%Y%m%d20201023[root@ecs-centos-7~]#date+%d23[root@ecs-centos-7~]#date+%d-d"20201013"13date+%d命令是计算当前日期(2020年10月23日)是月数Daydate+%d-d"20201013"命令计算202010月13日是本月的第几天和一年中的第几周[root@ecs-centos-7~]#date+%Y%m%d20201023[root@ecs-centos-7~]#date+%V43[root@ecs-centos-7~]#date+%V-d"20201005"41上面例子中,date+%V命令是计算当前日期是一年中的第几周,周一是一周的第一天,值范围是01-53,date+%V-d"20201005"命令是计算指定日期(20201005)是一年中的第一周和一周的第一天[root@ecs-centos-7~]#date+%Y%m%d20201023[root@ecs-centos-7~]#date+%u5[root@ecs-centos-7~]#date+%u-d"20201004"7在上面的例子中,日期+%u命令是计算当前日期是星期几,取值范围是1-7,表示周一到周日,结果为5,表示当前是周五。date+%u-d"20201004"命令是计算指定日期(20201004)是星期几,结果为7,表示2020年10月4日是星期日[root@ecs-centos-7~]#date+%Y%m%d20201023[root@ecs-centos-7~]#date+%w5[root@ecs-centos-7~]#date+%w-d"20201004"0在上面的例子中,日期+%w命令也是计算当前日期是星期几,取值范围是0-6,0代表星期天,1-6代表星期一到星期六。命令date+%w-d"20201004"是计算指定日期(20201004)是星期几,结果为0,表示2020年10月4日是星期日,是该月的第一天,本月最后一天[root@ecs-centos-7~]#date+"%Y-%m-%d"-d"-$(($(date+%d-d'2020-10-20')-1))天2020-10-20"2020-10-01[root@ecs-centos-7~]#date+"%Y-%m-%d"-d"-$(($(date+%d-d'2020-10-20')))天+1月2020-10-20"2020-10-31在上面的例子中,date+"%Y-%m-%d"-d"-$(($(date+%d-d'2020-10-20')-1))days2020-10-20”命令是计算日期2020-10-20中该月的第一天,结果为2020-10-01命令date+”%Y-%m-%d"-d"-$(($(date+%d-d'2020-10-20')))days+1month2020-10-20"为计算日期中月份的最后一天2020-10-20,结果为2020-10-31日期和UTC时间相互转换日期到UTC时间UTC时间为整数,将日期转换为UTC时间,更方便各种计算[root@ecs-centos-7~]#date+%s1603443806[root@ecs-centos-7~]#date+%s-d"2020-10-2012:00:00"1603166400[root@ecs-centos-7~]#date+%s-d"2020-10-2000:00:00"1603123200[root@ecs-centos-7~]#date+%s-d"2020-10-20"1603123200[root@ecs-centos-7~]#date+%s-d"2020-10-01"1601481600上面例子中date+%s命令是把当前时间转换成UTC时间,date+%s-d"2020-10-2012:00:00"命令是将2020-10-2012:00:00转换成UTC时间UTC时间到日期[root@ecs-centos-7~]#日期+%s-d"2020-10-2012:00:00"1603166400[root@ecs-centos-7~]#date-d"@1603166400"2020年10月20日星期二12:00:00CST命令date+%s-d"2020-10-2012:00:00"就是计算UTC时间2020-10-2012:00:00。命令date-d"@1603166400"是计算UTC时间对应的日期(1603166400)。结果是2020年10月20日星期二12:00:00CST。上一条命令的日期参数是相同的日期比较大小。在shell中直接比较日期等同于字符串比较。您可以先将日期转换为UTC时间,然后再进行比较。下面是一个日期对比测试脚本(t.sh),执行时需要传入两个日期进行对比#!/bin/bashdate1=$(date+%s-d"$1")date2=$(date+%s-d"$2")if[[${date1}-lt${date2}]];thenecho"$1<$2"elif[[${date1}-eq${date2}]];thenecho"$1=$2"elseecho"$1>$2"fi执行测试脚本,具体结果如下:[root@localhostshell_test]#./t.sh"20201020""20201020"20201020=20201020[root@localhostshell_test]#./t.sh"20201020""20201021"20201020<20201021[root@localhostshell_test]#./t.sh"20201020""20201019"20201020>20201019[root@localhostshell_test]#[root@localhostshell_test]#./t.sh"2020-10-2000:00:01""2020-10-2000:00:00"2020-10-2000:00:01>2020-10-2000:00:00[root@localhostshell_test]#./t.sh"2020-10-2000:00:01""2020-10-2000:00:01"2020-10-2000:00:01=2020-10-2000:00:01[root@localhostshell_test]#./t.sh"2020-10-2000:00:01""2020-10-2000:00:10"2020-10-2000:00:01<2020-10-2000:00:10[root@localhostshell_test]#可以从中看到结果Out,t.sh脚本输入日期参数??只能有年月日或者年月日时分秒,日期的格式可以是20201020格式或者2020-10-2000:00:00format日期循环遍历在工作中,经常需要处理一段时间内的日志,需要遍历日期,然后处理每天的日志,下面的测试脚本(t.sh)就是为了测试日期遍历,脚本内容如下:#!/bin/bash#开始日期begindate=$1#结束日期enddate=$2#第二天的日期,用来循环nextdate=${begindate}#UTC时间第二天,用来比较日期nextutc=$(date+%s-d"${nextdate}")#结束日期的UTC时间endutc=$(date+%s-d"${enddate}")while[${nextutc}-le${endutc}]doecho"process${nextdate}log..."#Calculate第二天的日期nextdate=$(date-d"${nextdate}1day"+%Y%m%d)#计算出第二天的UTC时间nextdate=$(date+%s-d"${nextdate}")done执行测试脚本,具体结果如下:[root@localhostshell_test]#./t.sh"20201020""20201023"process20201020log...process20201021log...process20201022log...process20201023log...