1년 중 모든 일요일의 날짜를 찾는 스크립트

1년 중 모든 일요일의 날짜를 찾는 스크립트

일년 중 54번째 일요일의 날짜를 인쇄하고 싶습니다. 다음 스크립트를 작성했지만 출력에 오류가 발생합니다.

스크립트:

req_date=`date +%m%d%Y`

for i in {1..54}

do
   NEXT_DATE=$(date +%m%d%Y -d "$req_date +  7*$i day")
   echo "$NEXT_DATE"
done

산출

+ for i in '{1..54}'
++ date +%m%d%Y -d '11132019 +  7*32 day'
date: invalid date ‘11132019 +  7*32 day’
+ NEXT_DATE=
+ echo ''

+ for i in '{1..54}'
++ date +%m%d%Y -d '11132019 +  7*33 day'
date: invalid date ‘11132019 +  7*33 day’
+ NEXT_DATE=
+ echo ''

+ for i in '{1..54}'
++ date +%m%d%Y -d '11132019 +  7*34 day'
date: invalid date ‘11132019 +  7*34 day’
+ NEXT_DATE=
+ echo ''

+ for i in '{1..54}'
++ date +%m%d%Y -d '11132019 +  7*35 day'
date: invalid date ‘11132019 +  7*35 day’
+ NEXT_DATE=
..

누군가 나를 도와줄 수 있나요?

답변1

존재하다 ksh93,

printf '%(%Y-%m-%d)T\n' '2020-01 '{1..52}'th Sunday'

2020년 전체 52개 일요일 목록을 제공합니다(더 유용하고 명확한 형식으로 제공되지만, YYYY-MM-DD정말로(정말?) 원한다면 언제든지 변경할 수 있습니다).%m%d%Y

printf '%(%Y-%m-%d)T\n' '2023-01 '{1..53}'th Sunday'

2023년에는 53.

1년에 일요일은 54일일 수 없습니다.

1년에 54명이 있을 수 있다그 중 2개는 완료되지 않았으므로 date +%W00~53의 값을 사용할 수 있지만 00주 또는 53주 중 적어도 하나의 일요일은 인접한 연도에 속하게 됩니다(그리고 00주 또는 53주가 1년 이상에 속할 수 있음). ; ISO 주 번호( )를 사용하면 %V이를 방지 하고 01에서 53까지 갑니다.

답변2

내 대답은 시작일부터 30주 사이의 모든 목요일이며 첫 번째 목요일을 선택하는 순서를 사용합니다.

paul@debian:~$         
strt="2023/06/01"
for i in `seq 0 30`;
        do
                echo "datum  $i $(date -d "${strt}+${i} week  " +"%A/%d/%m/%Y" )"
        done

datum  0 Thursday/01/06/2023
datum  1 Thursday/08/06/2023
datum  2 Thursday/15/06/2023
datum  3 Thursday/22/06/2023
datum  4 Thursday/29/06/2023
datum  5 Thursday/06/07/2023
datum  6 Thursday/13/07/2023
datum  7 Thursday/20/07/2023
datum  8 Thursday/27/07/2023
datum  9 Thursday/03/08/2023
datum  10 Thursday/10/08/2023
datum  11 Thursday/17/08/2023
datum  12 Thursday/24/08/2023
datum  13 Thursday/31/08/2023
datum  14 Thursday/07/09/2023
datum  15 Thursday/14/09/2023
datum  16 Thursday/21/09/2023
datum  17 Thursday/28/09/2023
datum  18 Thursday/05/10/2023
datum  19 Thursday/12/10/2023
datum  20 Thursday/19/10/2023
datum  21 Thursday/26/10/2023
datum  22 Thursday/02/11/2023
datum  23 Thursday/09/11/2023
datum  24 Thursday/16/11/2023
datum  25 Thursday/23/11/2023
datum  26 Thursday/30/11/2023
datum  27 Thursday/07/12/2023
datum  28 Thursday/14/12/2023
datum  29 Thursday/21/12/2023
datum  30 Thursday/28/12/2023

답변3

수정된 스크립트는 다음과 같습니다.

  • 세트요청 날짜올바른 것은 dd/mm/yyy이고 다음 일요일입니다.
  • 날짜 오프셋 계산에 bash 구문 사용
  • 루프는 인덱스 1이 아닌 0에서 시작하므로 54가 아닌 53에서 끝납니다.
req_date=`date +%m/%d/%Y -d sunday`

for i in {0..53}
do
    NEXT_DATE=$(date +%m%d%Y -d "$req_date +  $((7*i)) days")
    echo "$NEXT_DATE"
done

답변4

0주 또는 54주차 문제를 방지하려면 기준에 따라 모든 날짜를 반복하고 모든 일요일을 선택할 수 있습니다.

#!/bin/bash

#get day of year number for last day of year
total_days=$(date -d'2019-12-31' +%j)

#loop over all days and select Sundays
for (( i=0 ; i<${total_days} ; i++ )) ; do
  date -d"2019-01-01 + ${i}" +"%a %Y-%m-%d" | grep Su | cut -d' ' -f2
done

req_date또한 연중 모든 일요일의 시작 날짜를 지정하려면 이 옵션을 사용해야 합니다 -d. (다음 54개의 일요일로 시작하고 싶지 않은 경우 req_date)


귀하의 질문에 명시된 문제와 관련하여:

댓글에서 이미 언급했듯이 입력 형식이 잘못되었습니다. 가능한 날짜 입력 문자열은 다소 복잡하고 해석하기 직관적이지 않으므로 다소 확장되지만 자세한 내용은 에서 설명합니다 info "date input formats". 이것은 긴 설명입니다. 하이픈이나 슬래시를 사용하지 않으므로 여기서는

29.8 날짜 문자열의 순수 숫자

십진수가 YYYYMMDD 형식이고 날짜 문자열에서 그 앞에 다른 달력 날짜 항목(*달력 날짜 항목 참고::)이 나타나지 않으면 YYYY는 연도로 읽혀지고 MM은 월로 읽혀집니다. DD는 날짜가 지정한 달력 날짜의 월로 읽혀집니다.

따라서 귀하의 날짜 11132019는 존재하지 않는 1113-20-19이므로 실패합니다.

개인적으로 저는 위 스크립트에서 볼 수 있듯이 미국 날짜 형식과 다른 날짜 형식 간의 혼동을 배제하기 위해 yyyy-mm-dd를 사용하는 것을 선호합니다.

관련 정보