平常写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-%d"  -d  "-$(($(date +%d -d '2020-10-20') -1 )) days  2020-10-20"
2020-10-01[root@ecs-centos-7 ~]# date +"%Y-%m-%d"  -d  "-$(($(date +%d -d '2020-10-20') )) days +1 month  2020-10-20"
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时间,更方便各种计算

[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/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@localhost shell_test]# ./t.sh "20201020" "20201020"20201020  =  20201020
[root@localhost shell_test]# ./t.sh "20201020" "20201021"20201020  <  20201021
[root@localhost shell_test]# ./t.sh "20201020" "20201019"20201020  >  20201019 [root@localhost shell_test]# [root@localhost shell_test]# ./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@localhost shell_test]# ./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@localhost shell_test]# ./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@localhost shell_test]# 

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

日期循环遍历

在工作中,经常要处理一段时间内的日志,需要遍历日期,然后对每天的日志做处理,下面的测试脚本 ( 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..."#计算后一天的日期nextdate=$(date -d "${nextdate} 1 day" +%Y%m%d)#计算后一天日期的utc时间nextutc=$(date +%s -d "${nextdate}")done

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

[root@localhost shell_test]# ./t.sh "20201020" "20201023"
process 20201020 log...
process 20201021 log...
process 20201022 log...
process 20201023 log...

shell 脚本中日期运算相关推荐

  1. shell脚本中的YYYY-MM-DD格式日期

    我尝试在我的bash shell脚本中使用$(date) ,但我希望日期为YYYY-MM-DD格式. 我怎么得到这个? #1楼 你可以这样做: $ date +'%Y-%m-%d' #2楼 在bash ...

  2. Linux 下Shell脚本中的加减乘除运算

    在用shell脚本语言编程的时候,我们经常用到加减乘除等基本的数学运算操作,现在整理一下,放在这里,以备后用. Shell中常用的数学运算符有一下几个: +:对两个变量做加法.-:对两个变量做减法.* ...

  3. shell脚本中编写SQL中 以传参(${accdate})的方式 动态:求 前12个月的日期和求 前一周(7天的日期)

    shell脚本中 编写SQL中 以传参(${accdate})的方式 动态 求 前12个月的日期 CAST(CAST(DATE_FORMAT(DATE_SUB(from_unixtime(unix_t ...

  4. linux脚本获取日期格式,关于shell脚本中的bash:yyyy-mm-dd格式日期

    我尝试在bash shell脚本中使用$(date),但是我希望日期采用YYYY-MM-DD格式.我怎么得到这个? 在巴什: 从date获取年-月日 DATE=`date +%Y-%m-%d` GET ...

  5. shell有bool运算么_如何在shell脚本中声明和使用布尔变量?

    我尝试使用以下语法在shell脚本中声明一个布尔变量:variable=$false variable=$true 它是否正确? 另外,如果我想更新该变量,我会使用相同的语法? 最后,使用布尔变量作为 ...

  6. 7月11日任务 shell介绍、shell结构和执行 、date命令用法、shell脚本中的变量

    2019独角兽企业重金招聘Python工程师标准>>> 20.1 Shell脚本介绍 • shell是一种脚本语言  aming_linux  blog.lishiming.net ...

  7. 69:shell脚本介绍 | shell脚本结构 | 执行data命令用法 | shell脚本中变量

    2019独角兽企业重金招聘Python工程师标准>>> 1.shell脚本介绍: shell是一种脚本语言和传统的开发语言相比,会比较简单: shell有自己语法,可以支持逻辑判断. ...

  8. 数组-在Shell脚本中的基本使用介绍

    2019独角兽企业重金招聘Python工程师标准>>> Shell脚本在运维工作中是极其重要的,而数组在shell脚本里的运用无论是在循环或运算方面都是非常实用的一个环节. 下面是对 ...

  9. 在 Shell 脚本中跟踪调试命令的执行

    文章目录 shell 脚本调试系列 概述 shell 跟踪执行的重要性 shell 脚本调试系列 本系列的前面部分清晰地阐明了另外两种 shell 脚本调试模式:详细模式和语法检查模式,并用易于理解的 ...

最新文章

  1. YOLOv5是真的吗?并不比YOLOv4强,不配这个名字
  2. 用移位寄存器实现边沿检测(功能仿真及ISE综合)
  3. C++ IPv4与IPv6的兼容编码(转,出自http://blog.csdn.net/ligt0610/article/details/18667595)...
  4. RPC框架——简单高效hessian的使用方式
  5. boost::python::register_exception_translator相关的测试程序
  6. 图形—9patch,shape ,selector
  7. 木炭怎么获得_木炭机一体化流程中制做木炭是怎么完成的
  8. typecho独一无二的后台美化主题模板
  9. Magento 自定义URL 地址重写
  10. C 线性表的链式存储实现及插入、删除等操作示例
  11. lisp型材库_基于Auto LISP 创建V 带轮标准件库
  12. java打印特殊符号_Java Poi 在Excel中输出特殊符号的实现方法
  13. FDFS基础用法总结
  14. Python3中.whl文件介绍
  15. 线面图标设计样式解析
  16. 【干货】JavaScript 资源大全
  17. eclipse设置工作空间的默认编码和设置项目的编码
  18. Sublime Text3中文版下载网址
  19. 软考中级 真题 2018年下半年 系统集成项目管理工程师 基础知识 上午试卷
  20. xcode 项目 was compiled with optimization -stepping may behave oddly ;variable may not be available

热门文章

  1. 电脑浏览器主页面被恶意劫持无法修改的解决方法
  2. 基础复习——TextView——文本显示——字体颜色——背景颜色——字体大小——@color/teal_200——@string/hello...
  3. android support v13,java – 程序类型已存在:android.support.v13.v...
  4. ssm个人微空间图片相册共享系统
  5. PLG日志平台搭建: Promtail + Loki + Grafana 全步骤
  6. 用友U9V28应用中设置sa密码问题
  7. IT业界中的著名女性高管
  8. 微签电子印章自动生成上线
  9. iPhone 设备目录结构
  10. 【软考】2020下半年软件设计师 易错知识点(1)