如何列出未来 6 个月的所有周末?

如何列出未来 6 个月的所有周末?
$ 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

相关内容