从给定日期(不是当前日期)作为输入
获取上一个星期日日期作为输出示例输入:08-30-2017(%m-%d-%y)
输出应在上周日:08-27-2017
===
以下所有命令使用当前的参考。但是我想将参考日期作为输入以获取上周日的输入。请帮助我使用命令。
日期 %m-%d-%y -d" 2017-09-10 -7天"
日期 %m-%d-%y -d" last Sun"
我希望以下解决方案可以帮助您:
export day=08-30-2017
date -d "$day -$(date -d $day +%w) days"
这将始终在给定日期之前(或日期本身)之前打印。
date -d "$day -$(date -d $day +%u) days"
这将始终在给定日期之前的星期日打印(而不是日期本身)。
如果处理固定的日期格式%m-%d-%Y
,则应将其转换为%Y-%m-%d
格式,以通过date
函数处理:
d='08-30-2017'
d=${d##*-}-${d%-*}
lst_sunday=$(date -d "$d -$(date -d $d +%u) days" +"%m-%d-%Y")
echo $lst_sunday
08-27-2017
+%u
-解释格式指定器,一周的一天(1..7);1是星期一
非常简单的方式 -
从给定日期开始首先计算Dayofweek。将是1-7。星期一是1等...星期六6和星期日7。
然后从给定的日期减去Dayofweek。那是你的最后一个星期日。
$ givenDate="08-30-2017"
$ dayofweek=$(date -j -f '%m-%d-%Y' $givenDate +'%u')
$ date -j -f '%m-%d-%Y' -v-${dayofweek}d $givenDate +%m-%d-%Y
08-27-2017
这是从某种程度上查询某天(1..7)的功能
function query_last_date(){
declare -A week_day
week_day[1]="mon"
week_day[2]="tue"
week_day[3]="wed"
week_day[4]="thu"
week_day[5]="fri"
week_day[6]="sat"
week_day[7]="sun"
t="$1"
query_last_day=$2
d=${t##*-}-${t%-*}
inp_day=$(date -d $d +%u)
if test $query_last_day -gt $inp_day; then
offset=$(expr $inp_day + 7 - $query_last_day)
else
offset=$(expr $inp_day - $query_last_day)
fi
out_date=$(date -d "$d -$offset days" +"%m-%d-%Y")
echo "inp_date $t (${week_day[$inp_day]}) -> out_date $out_date (${week_day[$query_last_day]})"
}
query_last_date 09-30-2021 1
query_last_date 09-30-2021 2
query_last_date 09-30-2021 3
query_last_date 09-30-2021 4
query_last_date 09-30-2021 5
query_last_date 09-30-2021 6
query_last_date 09-30-2021 7
预期输出如下,
inp_date 09-30-2021 (thu) -> out_date 09-27-2021 (mon)
inp_date 09-30-2021 (thu) -> out_date 09-28-2021 (tue)
inp_date 09-30-2021 (thu) -> out_date 09-29-2021 (wed)
inp_date 09-30-2021 (thu) -> out_date 09-30-2021 (thu)
inp_date 09-30-2021 (thu) -> out_date 09-24-2021 (fri)
inp_date 09-30-2021 (thu) -> out_date 09-25-2021 (sat)
inp_date 09-30-2021 (thu) -> out_date 09-26-2021 (sun)