나는 명령이 date -d 'last-monday - 14 days' +%Y%m%d
"오늘 날짜"로부터 2주 전 월요일을 인쇄한다는 것을 알고 있습니다. 다양한 날짜에 상황을 테스트하고 결과를 확인할 수 있는 방법이 필요합니다. 상대 날짜를 계산하려면 date 명령을 언급해야 할 것 같습니다.
다음과 같은 다양한 날짜를 테스트하려면 뭔가가 필요합니다.
date -d 'last-monday - 14 days' %Y%m%d from 20190315
date -d 'last-monday - 14 days' %Y%m%d from 20180217
date -d 'last-monday - 14 days' %Y%m%d from 201700914
그리고 해당 출력을 봅니다.
답변1
#!/bin/bash
# Our given dates
dates=(
20190315
20180217
20170914
)
# Loop over the given dates
for thedate in "${dates[@]}"; do
# Get day of the week as digit (1 is Monday, 7 is Sunday)
day=$( date -d "$thedate" +%u )
# The Monday the same week is $(( day - 1 )) days earlier than the given date.
# The Monday two weeks earlier is 14 days earlier still.
date -d "$thedate -$(( day - 1 + 14 )) days" +"$thedate --> %Y%m%d"
done
산출:
20190315 --> 20190225
20180217 --> 20180129
20170914 --> 20170828
--date
어려운 점은 GNU가 최종 날짜를 계산하기 위해 올바른 문자열을 작성하는 방법을 알아내는 것입니다 . 나는 주어진 날짜에 대한 요일을 계산한 다음 이를 사용하여 주어진 날짜를 며칠만큼 오프셋하는 날짜 문자열을 계산하여 결과 날짜가 2주 전 월요일이 되도록 선택했습니다.-d
date
위 스크립트에서 옵션 매개변수 에 사용되는 실제 문자열 -d
(스크립트에 지정된 날짜 사용)은 다음과 같습니다.
20190315 -18 days
20180217 -19 days
20170914 -17 days
단일 날짜에 대해 계산을 수행하는 단일 명령으로 스크립트를 압축합니다 $thedate
.
date -d "$thedate -$(date -d "$thedate" +%u) days -13 days" +%Y%m%d
또는
date -d "$thedate -$(date -d "$thedate" +"-%u days -13 days")" +%Y%m%d
답변2
$ date
Wed Mar 20 15:02:23 MST 2019
$ date -d "last-monday"
Mon Mar 18 00:00:00 MST 2019
$ date -d "last-monday - 1 week"
Mon Mar 11 00:00:00 MST 2019
답변3
적어도 데비안에는 faketime
패키지 가 있습니다
faketime '2019-03-15' date
Fri 15 Mar 00:00:00 GMT 2019
faketime '2019-03-15' date --date 'last monday - 14 days'
Mon 25 Feb 00:00:00 GMT 2019
답변4
나는 "재사용 가능한 도구" 접근 방식을 취하려고 노력합니다.
내 monday
스크립트:
#!/bin/bash
date=${1:-now}
shift
dow=`date +%u -d "$date"`
dow0=$[ $dow - 1 ]
date -d "$date -$dow0 days" "$@"
작동 방식:
date -d
첫 번째 명령줄 매개변수에서 매개변수를 가져옵니다(예: "2020-01-01 -2 주")- 형식 지정과 같이 최종 날짜 명령에 전달되는 추가 매개변수
+%F
- 요일을 얻으려면 %u (1..7)을 사용하십시오. 1은 월요일입니다.
- 우리가 원하는 범위는 0~6이므로 1을 뺍니다.
- 주어진 날짜에서 "요일" 오프셋을 뺀 값을 표시합니다.
비슷한 sunday
스크립트로 결과가 약간 더 간단해졌습니다.
#!/bin/bash
date=${1:-now}
shift
dow=`date +%w -d "$date"`
date -d "$date -$dow days" "$@"
용법:
# monday
Mon Aug 29 02:28:45 PM AEST 2022
# sunday now +%F
2022-08-28
# monday '2022-12-01' +%F
2022-11-28