주어진 날짜로부터 다음 토요일 날짜를 가져옵니다.

주어진 날짜로부터 다음 토요일 날짜를 가져옵니다.

특정 날짜 이후의 다음 토요일 날짜를 원합니다. 예를 들어, $date1="30-AUG-2015"05-SEP-2015라는 결과를 원합니다.

나는 성공하지 못한 채 다음 명령을 모두 시도했습니다.

samba@samba:~$ date1="30-AUG-2015"
samba@samba:~$ date2=$(date --date='"$date1" +next Saturday')
date: invalid date ‘"$date1" +next Saturday’

samba@samba:~$ date1="30-AUG-2015"
samba@samba:~$ date2=$(date --date1='next Saturday')
date: unrecognized option '--date1=next Saturday'
Try 'date --help' for more information.

samba@samba:~$ date1="30-AUG-2015"
samba@samba:~$ date -d "$date1 next saturday"
Sun Aug 30 00:00:00 IST 2015
samba@samba:~$ $date1 -d "next saturday"
30-AUG-2015: command not found

답변1

나는 강력히 추천한다날짜 도구이런 일을 위해.

Fedora Linux 21+ 또는 CentOS/RHEL(EPEL 포함):

dnf install dateutils 

( yum이전 버전의 RHEL에서는 DNF 대신)

Debian 기반 시스템에서는 패키지를 호출할 수도 있지만 관련 없는 패키지의 동일한 이름을 가진 명령과 일부 패키지를 구별하기 dateutils위해 명령 앞에 접두사가 붙습니다 (따라서 아래 명령 으로 대체됨).dateutils.daterounddateutils.dround

그런 다음 다음을 수행하십시오.

dateround today sunday

"오늘"을 사용하거나 실제 날짜로 바꿀 수 있습니다.

$ dateround 2015-08-30 saturday
2015-09-05

2015년 8월 30일과 같이 특정 형식으로 날짜를 입력해야 하는 경우 다음과 같이 -i또는 옵션을 사용할 수 있습니다.--input-format

$ dateround -i '%d-%b-%Y' 30-AUG-2015 saturday
2015-09-05

"dateround"라는 이름에서 바로 알 수는 없지만 이 명령은반올림— 즉, 월요일은 이전 일요일로 롤백되지 않습니다. 일치하는 항목이 있으면 기본적으로 현재 날짜도 반환합니다. 예를 들어 오늘이 일요일이면 dateround today sunday오늘 날짜가 제공됩니다. 항상 미래 날짜가 되도록 하려면 이 --next플래그를 추가하세요.

답변2

그리고 ksh93:

$ LC_ALL=C ksh93 -c 'printf "%(%c)T\n" "30-Aug-2015 Saturday"'
Sat Sep  5 00:00:00 2015

날짜가 토요일이면 같은 날 반환됩니다. 다음 토요일을 원하면 다음을 수행하십시오.

LC_ALL=C printf "%(%c)T\n" "30-Aug-2015 tomorrow Saturday"

원하는 사양 %c으로 교체하세요 .strftime

$ LC_ALL=C printf "%(%d-%b-%Y)T\n" "03-Jan-2015 tomorrow saturday"
10-Jan-2015

이렇게 하려면 10-JAN-2015다음과 같이 선언된 변수에 할당하십시오 typeset -u.

typeset -u date=${
  LC_ALL=C printf "%(%d-%b-%Y)T\n" "03-Jan-2015 tomorrow saturday"
}

GNU를 통해 구현됨 date:

$ d=03-JAN-2015
$ LC_ALL=C date -d "$d +1 week -$(date -d "$d +1 day" +%w) day" '+%d-%^b-%Y'
10-JAN-2015

답변3

매일, 매주, 반복이 필요 없는 단선 솔루션

MON=1
TUE=2
WED=3
THU=4
FRI=5
SAT=6
SUN=7

echo "Today "          && date
echo "Next Monday "    && date -d "+ $(( ( (6 + $MON - $(date +%u)) % 7) + 1 )) days"
echo "Next Tuesday "   && date -d "+ $(( ( (6 + $TUE - $(date +%u)) % 7) + 1 )) days"
echo "Next Wednesday " && date -d "+ $(( ( (6 + $WED - $(date +%u)) % 7) + 1 )) days"
echo "Next Thursday "  && date -d "+ $(( ( (6 + $THU - $(date +%u)) % 7) + 1 )) days"
echo "Next Friday "    && date -d "+ $(( ( (6 + $FRI - $(date +%u)) % 7) + 1 )) days"
echo "Next Saturday "  && date -d "+ $(( ( (6 + $SAT - $(date +%u)) % 7) + 1 )) days"
echo "Next Sunday "    && date -d "+ $(( ( (6 + $SUN - $(date +%u)) % 7) + 1 )) days"

산출

Today
Thu, Nov 12, 2020 10:24:38 PM
Next Monday
Mon, Nov 16, 2020 10:24:39 PM
Next Tuesday
Tue, Nov 17, 2020 10:24:40 PM
Next Wednesday
Wed, Nov 18, 2020 10:24:40 PM
Next Thursday
Thu, Nov 19, 2020 10:24:41 PM
Next Friday
Fri, Nov 13, 2020 10:24:42 PM
Next Saturday
Sat, Nov 14, 2020 10:24:42 PM
Next Sunday
Sun, Nov 15, 2020 10:24:43 PM

설명하다

한 주의 둘째 날까지의 일수를 계산하고 이 숫자를 현재 날짜에 더하는 것이 아이디어입니다. 토요일을 예로 들어보겠습니다.

  • 월요일 + 5일
  • ...
  • 금요일 + 1일
  • 토요일 + 7일
  • 일요일 + 6일

따라서 알고리즘의 첫 번째 반복은 현재 요일을 취하고 date +%u모듈러스 가 0부터 시작하므로 mod 7더하는 것처럼 보입니다.1

( $(date +%u) % 7) + 1

그러나 내림차순(5,4,3,2,1,7,6)으로 날짜를 추가하는 것은 고려되지 않습니다. 이를 수용하려면 현재 요일을 뺀 7다음 모듈로를 취하고 다음을 추가해야 합니다 1.

( (7 - $(date +%u)) % 7) + 1

이는 7 == 6 + $MON월요일( )에 대한 실제 사례를 제공합니다. 특정 요일을 검색하도록 하려면 다음과 같이 다시 작성해야 합니다.

( (6 + <DAY> - $(date +%u)) % 7) + 1

<DAY>위의 변수 중 하나는 어디에 있어야합니까( $MON... $SUN)

Alpine Linux에 대한 수정 사항

Alpine Linux는 이를 지원하지 않으므로 작동하려면 -d "+ 3 days"설치 coreutils ( )하거나 직접 계산해야 합니다.apk add coreutils

date -d "@$(($(date +%s) + 86400 * $(( ( (6 + $SAT - $(date +%u)) % 7) + 1 )) ))"

설명하다

$(date +%s)이후 경과된 시간을 출력합니다...! 알잖아! 날짜가 복원되는 86400날짜당 초 수입니다 .date -d "@<number_of_seconds>"

Mac 운영 체제에 대한 수정

date -d "@<number_of_seconds>"를 작성 하는 date -r "<number_of_seconds>"대신 MacOS를 제외하고 "Alpine Linux 수정"과 유사하게 작동하므로

date -r "$(($(date +%s) + 86400 * $(( ( (6 + $SAT - $(date +%u)) % 7) + 1 )) ))"

자세한 내용은 위의 "Alpine Linux용 수정 사항/참고 사항"을 참조하세요.

답변4

더 간단한 해결책은 다음과 같습니다.

$ adate1="30-AUG-2015"

$ faketime "$adate1" date -d 'saturday' +'%d-%b-%Y'

05-Sep-2015

물론 faketime을 설치해야 합니다.

관련 정보