shell操作日期时,经常会遇到获取某一日期所对应的本周的周几,以获取对应的本周周六为例,那如果获取本周周六的日期,是比较简单的,有直接的函数搞定,具体shell脚本如下:
CURRENT_SAT_DATE_WITH_MINUS=`date -d "saturday" "+%Y%m%d"`
但是有的时候为了实现动态化程序的处理,可能这个日期不一定是当前日期,是个变化的参数日期,那要获取这个动态参数日期对应的本周周几怎么办呢?我找了下现成的函数,都没搞定,于是就走点弯路吧,突然想起以前写日历的算法,自己写了一个小算法,以获取本周六为例,这里先普及一个概念:时间戳:时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数。 具体代码如下get_sat.sh:
#! /bin/bash
EVENT_DAY=$1 #定义随意的一天的参数
MONDAY='19000205' #指定是周一的日期,小一点比较好,因为正常使用的日期都比这个大,确保后面面stampDiff=`expr $endDate - $startDate`为正数
startDate=`date -d ${MONDAY} +%s` #计算周一的时间戳
echo "startDate:$startDate"
endDate=`date -d ${EVENT_DAY} +%s` #计算任意一天的时间戳
echo "endDate:$endDate"
stampDiff=`expr $endDate - $startDate` #得到任意一天和周一时间戳的相差值
weekDiff=`expr $[stampDiff/604800]` #604800=60*60*24*7 即一周的时间戳总和,两者差值时间戳除以604800取整数得到随意时间和周一19000205相差的周数
echo "weekDiff:$weekDiff"
n_end=$(($weekDiff*7)) #得到随意时间和周一19000205相差的天数,那么周一19000205加上相差的天数刚好得到随意时间对应的本周周一
n_end=$[`expr $n_end + 5`] #因为是周六,那么再加5天,要获取其他时间依情况更换加的天数
echo "n_end : $n_end"
THIS_SAT_DAY=$(date -d "$MONDAY +${n_end} days" +%Y%m%d) #那么原来的周一19000205加上相差的总天数得到随意时间对应的本周六
echo "THIS_SAT_DAY:$THIS_SAT_DAY" #输出结果
调用和运行如下:
[hadoop@shucang-10 sakura]$ ./get_sat.sh 20200402
startDate:-2205993943
endDate:1585756800
weekDiff:6269
n_end : 43888
THIS_SAT_DAY:20200404
|