前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在Shell中使用日期运算和比较

在Shell中使用日期运算和比较

原创
作者头像
用户7108768
修改2021-11-01 09:16:49
1.6K0
修改2021-11-01 09:16:49
举报

脚本内容大概主要包括以下: 1、有且只有两个输入参数,都是必输项。 2、参数的格式是日期且格式是“yyyyMMdd"(如:20140101) 3、第二个参数一定要比第一个参数晚 4、最终的执行结果就是将两个日期区间的日期打印出来。

代码语言:javascript
复制
#!/bin/bash
startDate="$1"
endDate="$2"
DATE_FMT="%Y%m%d"
source ./log.sh
export DEBUG="true"
function showUsage() { 
    warn ""
    warn "------------------------ Usage ----------------------------- "
    warn " Syntax:  checkInputDates.sh <start date> <end date>"
    warn ""
    warn " Remark: " 
    warn "   1.Two arguments are required and must with format 'YYYYmmDD'."
    warn "   2.Named 'end date' argument must be greater then or equal to 'start date' argument."
    warn ""
    warn "  Example: checkInputDates.sh 20140102 20140901" 
    warn "------------------------------------------------------------ "
}
DATE_FMT=${DATE_FMT:-"%Y%m%d"} ##Default with format "%Y%m%d", eg: 20140102
function checkDateValid() {
    local myDate=$1
    local exp="date +$DATE_FMT -d $myDate"
    if [ "$myDate" == "$exp" ]; then
        echo "1"
    else 
        echo "0"
    fi

}
#
TODO: It's not correctly.
#
function datesDiff() {
    local d1=date -d &quot;$1&quot; +%s
    local d2=date -d &quot;$2&quot; +%s

##debug "Dates: "$d1 $d2
local cr=$(($d1-$d2)); ##Diff in 'day' unit.
echo $cr

}
#
Return the day after input date.
Usage: toTomorrow <input date>
#
function compareDates() {

## `date -d " 20141225 1 day" +%Y%m%d`
local cr=$(datesDiff $1 $2); ##Diff in 'day' unit.
##debug "Compare: $(($(date +$DATE_FMT -d $1) - $(date +$DATE_FMT -d $2)));"; 
if [[ $cr -eq 0 ]]; then 
    echo "0"
elif [[ $cr -gt 0 ]]; then
    echo "1"
else 
    echo "-1"  
fi

}
#
Return the day after input date.
Usage: toTomorrow <input date>
#
function toTomorrow() {

local curDate="$1"
##debug $curDate

##TODO: Must be adapted to DATE_FMT... 
##curDate="${curDate:0:4}-${curDate:4:2}-${curDate:6:2}"

##debug "date -d '$curDate +1 day ' +$DATE_FMT"
##echo `date -d "$curDate +1 day " +$DATE_FMT`
##echo `date +$DATE_FMT -d "1 day $curDate"`
echo `date -d "1 day $curDate" +$DATE_FMT`

}
function countStrsByBlank() {

##local str="$1"
##local sep="${2:-' '}" 
##echo $str |  awk -v v="$sep" '{ split($0, a, v);for(i in a) {c=i;}} END {print c;}'

set j=0
  for item in $dates
  do
    let j=j+1
  done
  echo $j
}
#
Get the diff date list between input two dates.
Usage: getDiffDateList <end date> <start date>
#
function getDiffDateList() {

local endd=$1
local stad=$2
dl=() 
while [[ "$stad" != "$endd" ]]
do
    dl=(${dl[*]} "$stad")
    stad=$(toTomorrow $stad)
done
dl=(${dl[*]} "$stad")
echo "${dl[*]}"

}
Check inputs
1. Only two arguments.
warn ""
if [ $# != 2 ]; then
    warn "ERROR: Only support two arguments input." | showUsage 
    exit 1;
fi
2. Check if they're the leagal value.
tmpSd=$(checkDateValid $startDate) 
if [ "$tmpSd" == "0" ]; then ###It's the invalid date. eg: 20141901
    warn "ERROR: Invalid 'start date' with input '$startDate', it must be with format 'yyyyMMdd', eg: 20140101" | showUsage
    exit 1;

fi

tmpEd=$(checkDateValid $endDate) 
if [ "$tmpEd" == "0" ]; then ###It's the invalid date. eg: 20141901 
    warn "ERROR: Invalid 'end date' with input '$startDate', it must be with format 'yyyyMMdd', eg: 20140101" 
    exit 1;
fi
3. Check the arg2 greater than or equal arg1.
echo "Compare result: "$(compareDates $endDate $startDate)
cprs=$(compareDates $endDate $startDate) 
if [ "$cprs" == "-1" ]; then
    warn "ERROR: The first argument must not greater than the second one!" | showUsage 
    exit 1;
fi
#
loop the dates between start and end date.
while [[ "$startDate" != "$endDate" ]]
do
    echo $startDate
    startDate=$(toTomorrow $startDate)
done</pre> 

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档