$ SAT=$(date -dsaturday +%Y-%m-%d)
$ SUN=$(date -dsunday +%Y-%m-%d)
$
$ echo $SAT
2016-04-09
$ echo $SUN
2016-04-10
$
我知道如何列出周六和周日的下一个日期。
如何列出接下来 6 个月的所有下周六和周日?
我在 Ubuntu 上使用 bash。
答案1
一旦您确定了星期六和/或星期日的初始开始日期,您就可以使用相对日期在 bash 脚本中使用循环来执行此操作。
#!/bin/bash
SAT=$(date -dsaturday +%Y-%m-%d)
SUN=$(date -dsunday +%Y-%m-%d)
# 365 days/year / 2 ~= 182 days
ENDSAT=$(date -d "$SAT + 182 days" +"%Y-%m-%d")
ENDSUN=$(date -d "$SUN + 182 days" +"%Y-%m-%d")
echo $SAT
echo $SUN
until [ "$SUN" == "$ENDSUN" ]; do
SAT=$(date -d "$SAT + 7 days" +%Y-%m-%d)
SUN=$(date -d "$SUN + 7 days" +%Y-%m-%d)
echo $SAT
echo $SUN
done
我在初始设置中不使用“+ 6 个月”,因为它可能会导致工作日略有变化,因为月份有不同的天数。
答案2
以人类可读的格式呈现周末的最简单方法是:
cal -A6
这将打印下一个卡尔恩达尔:
2016
April May June
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 1 2 3 4 5 6 7 1 2 3 4
3 4 5 6 7 8 9 8 9 10 11 12 13 14 5 6 7 8 9 10 11
10 11 12 13 14 15 16 15 16 17 18 19 20 21 12 13 14 15 16 17 18
17 18 19 20 21 22 23 22 23 24 25 26 27 28 19 20 21 22 23 24 25
24 25 26 27 28 29 30 29 30 31 26 27 28 29 30
July August September
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 1 2 3 4 5 6 1 2 3
3 4 5 6 7 8 9 7 8 9 10 11 12 13 4 5 6 7 8 9 10
10 11 12 13 14 15 16 14 15 16 17 18 19 20 11 12 13 14 15 16 17
17 18 19 20 21 22 23 21 22 23 24 25 26 27 18 19 20 21 22 23 24
24 25 26 27 28 29 30 28 29 30 31 25 26 27 28 29 30
31
October
Su Mo Tu We Th Fr Sa
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
如果您需要一份清单仅有的周六和周日:
nextsat="$(date -d "next sat" +%Y-%m-%d)"
for i in {0..26}; do
date -d "$nextsat +$((i*7)) day" +%a-%Y-%m-%d
date -d "$nextsat +$((i*7+1)) day" +%a-%Y-%m-%d
done
6个月(半年)的范围是(大约)~182天,但除非有特殊情况,否则是26周。这就是原因{0..26}
。本周是零周还有26周。如果严格需要 26 周,则使用 {0..25}。
答案3
#!/bin/bash
WEEK=0
END_MONTH=$((`date -d "6 months" +%m` + 1)) |sed 's/^0//'
while true; do
CURRENT_MONTH=`date -d "$WEEK weeks" +%m`|sed 's/^0//'
if [[ $CURRENT_MONTH -ne $END_MONTH ]]; then
date -d "$WEEK weeks saturday" +%Y-%m-%d
date -d "$WEEK weeks sunday" +%Y-%m-%d
else
#$END_MONTH reached... exiting
exit 0
fi
let "WEEK++"
done