향후 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개월 동안 다음 토요일과 일요일을 모두 나열하는 방법은 무엇입니까?

우분투에서 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주 남은 0주차입니다. 엄격히 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

관련 정보