shell 脚本中日期运算

平常写shell脚本的过程中,经常要用到日期的运算,比如:日期的加减、与UTC时间换算,比较大小等等,下面就来聊一聊这些常用的日期运算

日期加减

  • 秒增减
[root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "70 second 2020-10-20 12:00:00"
2020-10-20 12:01:10
[root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "-70 second 2020-10-20 12:00:00"
2020-10-20 11:58:50
  • 分钟增减
[root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "10 minute 2020-10-20 12:00:00"
2020-10-20 12:10:00
[root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "-10 minute 2020-10-20 12:00:00"
2020-10-20 11:50:00

  • 小时增减
[root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "1 hour 2020-10-20 12:00:00"
2020-10-20 13:00:00
[root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "-1 hour 2020-10-20 12:00:00"
2020-10-20 11:00:00

  • 天增减
[root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "3 day 2020-10-20 12:00:00"
2020-10-23 12:00:00
[root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "-3 day 2020-10-20 12:00:00"
2020-10-17 12:00:00

  • 周增减
[root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "1 week 2020-10-20 12:00:00"
2020-10-27 12:00:00
[root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "-1 week 2020-10-20 12:00:00"
2020-10-13 12:00:00

  • 月增减
[root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "2 month 2020-10-20 12:00:00"
2020-12-20 12:00:00
[root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "-2 month 2020-10-20 12:00:00"
2020-08-20 12:00:00

  • 年增减
[root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "1 year 2020-10-20 12:00:00"
2021-10-20 12:00:00
[root@ecs-centos-7 ~]# date +'%Y-%m-%d %H:%M:%S' -d "-1 year 2020-10-20 12:00:00"
2019-10-20 12:00:00

  • 年月日时分秒增减
    年月日时分秒除了每一个单独进行日期增减之外,还可以一起使用
[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"
2021-12-27 14:50:40

  • 一个月中第几天
[root@ecs-centos-7 ~]# date +%Y%m%d
20201023
[root@ecs-centos-7 ~]# date +%d
23
[root@ecs-centos-7 ~]# date +%d -d "20201013"
13

date +%d 命令是计算当前日期( 2020年10月23日 ) 是一个月中的第几天

date +%d -d “20201013” 命令是计算 2020年10月13日 是一个月中第几天

  • 一年中第几周
[root@ecs-centos-7 ~]# date +%Y%m%d
20201023
[root@ecs-centos-7 ~]# date +%V
43
[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%d
20201023
[root@ecs-centos-7 ~]# date +%u
5
[root@ecs-centos-7 ~]# date +%u -d "20201004"
7

上面的例子中,date +%u 命令是计算当前日期是一周中第几天,取值范围是 1 - 7,分别表示周一至周日,结果是 5,表示当前这一天是周五, date +%u -d “20201004” 命令是计算指定日期 ( 20201004 ) 是一周中第几天,结果是 7 ,表示 2020年10月4日是周日

[root@ecs-centos-7 ~]# date +%Y%m%d
20201023
[root@ecs-centos-7 ~]# date +%w
5
[root@ecs-centos-7 ~]# date +%w -d "20201004"
0

上面例子中,date +%w 命令是也是计算当前日期是一周中第几天,取值范围是 0 - 6 , 0 代表周日,1 - 6 分别代表周一至周六

命令 date +%w -d “20201004” 是计算指定日期 ( 20201004 ) 是一周中第几天,结果是 0,表示2020年10月4日是周日

  • 月第一天和月最后一天
[root@ecs-centos-7 ~]# date +"%Y-%m-01"  -d  "2020-10-20"
2020-10-01

[root@ecs-centos-7 ~]# date +"%Y-%m-%d" -d "next month last day `date +%Y-%m-01 -d 2020-10-20`"
2020-10-31

上面例子中,date +"%Y-%m-01" -d “2020-10-20” 命令是计算日期 2020-10-20 中月份的第一天, 结果是 2020-10-01

命令 date +"%Y-%m-%d" -d "last days next month `date +%Y-%m-%d -d 2020-10-20`" 是计算日期 2020-10-20 中月份的最后一天, 结果是 2020-10-31 (下个月第一天的前一天)

日期和UTC时间互相转换

  • 日期转 UTC 时间
    UTC时间是整数,把日期转成UTC时间,更方便各种计算
[root@ecs-centos-7 ~]# date +%s
1603443806
[root@ecs-centos-7 ~]# date +%s -d "2020-10-20 12:00:00"
1603166400
[root@ecs-centos-7 ~]# date +%s -d "2020-10-20 00: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-20 12:00:00” 命令是把 2020-10-20 12:00:00 转成UTC时间

  • UTC时间转日期
[root@ecs-centos-7 ~]# date +%s -d "2020-10-20 12:00:00"
1603166400
[root@ecs-centos-7 ~]# date -d "@1603166400"
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 ),执行时需要传入两个待比较的日期

#!/bin/bash

date1=$(date +%s -d "$1")
date2=$(date +%s -d "$2")

if [ ${date1} -lt ${date2} ]; then
    echo " $1  <  $2 "
elif [ ${date1} -eq ${date2} ]; then
    echo " $1  =  $2 "
else
    echo " $1  >  $2 "
fi

执行测试脚本,具体结果如下:

[root@node1 ~]# sh t.sh "20201020" "20201020"
 20201020  =  20201020 
[root@node1 ~]# sh t.sh "20201020" "20201021"
 20201020  <  20201021 
[root@node1 ~]# sh t.sh "20201020" "20201019"
 20201020  >  20201019 
[root@node1 ~]# sh t.sh "2020-10-20 00:00:01" "2020-10-20 00:00:00"
 2020-10-20 00:00:01  >  2020-10-20 00:00:00 
[root@node1 ~]# sh t.sh "2020-10-20 00:00:01" "2020-10-20 00:00:01"
 2020-10-20 00:00:01  =  2020-10-20 00:00:01 
[root@node1 ~]# sh t.sh "2020-10-20 00:00:01" "2020-10-20 00:00:10"
 2020-10-20 00:00:01  <  2020-10-20 00:00:10 
[root@node1 ~]# 

从结果可以看出, t.sh 脚本传入日期参数既可以只有年月日又可以年月日时分秒都有,而且日期的格式既可以是 20201020 格式,又可以是 2020-10-20 00:00:00 格式的

日期循环遍历

在工作中,经常要处理一段时间内的日志,需要遍历日期,然后对每天的日志做处理,下面的测试脚本 ( t.sh ) 是测试日期遍历的, 脚本内容如下:

#!/bin/bash

begindate=$1
enddate=$2

while [ `date +%s -d ${begindate}` -le `date +%s -d ${enddate}` ]
do
        echo "process ${begindate}  log..."
        begindate=`date +%Y%m%d -d "${begindate} next day"`
done

执行测试脚本,具体结果如下:

[root@node1 ~]# sh t2.sh "20211201" "20211211"
process 20211201  log...
process 20211202  log...
process 20211203  log...
process 20211204  log...
process 20211205  log...
process 20211206  log...
process 20211207  log...
process 20211208  log...
process 20211209  log...
process 20211210  log...
process 20211211  log...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值