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-%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 脚本中日期运算相关推荐
- shell脚本中的YYYY-MM-DD格式日期
我尝试在我的bash shell脚本中使用$(date) ,但我希望日期为YYYY-MM-DD格式. 我怎么得到这个? #1楼 你可以这样做: $ date +'%Y-%m-%d' #2楼 在bash ...
- Linux 下Shell脚本中的加减乘除运算
在用shell脚本语言编程的时候,我们经常用到加减乘除等基本的数学运算操作,现在整理一下,放在这里,以备后用. Shell中常用的数学运算符有一下几个: +:对两个变量做加法.-:对两个变量做减法.* ...
- shell脚本中编写SQL中 以传参(${accdate})的方式 动态:求 前12个月的日期和求 前一周(7天的日期)
shell脚本中 编写SQL中 以传参(${accdate})的方式 动态 求 前12个月的日期 CAST(CAST(DATE_FORMAT(DATE_SUB(from_unixtime(unix_t ...
- linux脚本获取日期格式,关于shell脚本中的bash:yyyy-mm-dd格式日期
我尝试在bash shell脚本中使用$(date),但是我希望日期采用YYYY-MM-DD格式.我怎么得到这个? 在巴什: 从date获取年-月日 DATE=`date +%Y-%m-%d` GET ...
- shell有bool运算么_如何在shell脚本中声明和使用布尔变量?
我尝试使用以下语法在shell脚本中声明一个布尔变量:variable=$false variable=$true 它是否正确? 另外,如果我想更新该变量,我会使用相同的语法? 最后,使用布尔变量作为 ...
- 7月11日任务 shell介绍、shell结构和执行 、date命令用法、shell脚本中的变量
2019独角兽企业重金招聘Python工程师标准>>> 20.1 Shell脚本介绍 • shell是一种脚本语言 aming_linux blog.lishiming.net ...
- 69:shell脚本介绍 | shell脚本结构 | 执行data命令用法 | shell脚本中变量
2019独角兽企业重金招聘Python工程师标准>>> 1.shell脚本介绍: shell是一种脚本语言和传统的开发语言相比,会比较简单: shell有自己语法,可以支持逻辑判断. ...
- 数组-在Shell脚本中的基本使用介绍
2019独角兽企业重金招聘Python工程师标准>>> Shell脚本在运维工作中是极其重要的,而数组在shell脚本里的运用无论是在循环或运算方面都是非常实用的一个环节. 下面是对 ...
- 在 Shell 脚本中跟踪调试命令的执行
文章目录 shell 脚本调试系列 概述 shell 跟踪执行的重要性 shell 脚本调试系列 本系列的前面部分清晰地阐明了另外两种 shell 脚本调试模式:详细模式和语法检查模式,并用易于理解的 ...
最新文章
- YOLOv5是真的吗?并不比YOLOv4强,不配这个名字
- 用移位寄存器实现边沿检测(功能仿真及ISE综合)
- C++ IPv4与IPv6的兼容编码(转,出自http://blog.csdn.net/ligt0610/article/details/18667595)...
- RPC框架——简单高效hessian的使用方式
- boost::python::register_exception_translator相关的测试程序
- 图形—9patch,shape ,selector
- 木炭怎么获得_木炭机一体化流程中制做木炭是怎么完成的
- typecho独一无二的后台美化主题模板
- Magento 自定义URL 地址重写
- C 线性表的链式存储实现及插入、删除等操作示例
- lisp型材库_基于Auto LISP 创建V 带轮标准件库
- java打印特殊符号_Java Poi 在Excel中输出特殊符号的实现方法
- FDFS基础用法总结
- Python3中.whl文件介绍
- 线面图标设计样式解析
- 【干货】JavaScript 资源大全
- eclipse设置工作空间的默认编码和设置项目的编码
- Sublime Text3中文版下载网址
- 软考中级 真题 2018年下半年 系统集成项目管理工程师 基础知识 上午试卷
- xcode 项目 was compiled with optimization -stepping may behave oddly ;variable may not be available
热门文章
- 电脑浏览器主页面被恶意劫持无法修改的解决方法
- 基础复习——TextView——文本显示——字体颜色——背景颜色——字体大小——@color/teal_200——@string/hello...
- android support v13,java – 程序类型已存在:android.support.v13.v...
- ssm个人微空间图片相册共享系统
- PLG日志平台搭建: Promtail + Loki + Grafana 全步骤
- 用友U9V28应用中设置sa密码问题
- IT业界中的著名女性高管
- 微签电子印章自动生成上线
- iPhone 设备目录结构
- 【软考】2020下半年软件设计师 易错知识点(1)