GNU Date를 사용하여 특정 날짜보다 2주 전의 월요일 날짜를 가져옵니다.

GNU Date를 사용하여 특정 날짜보다 2주 전의 월요일 날짜를 가져옵니다.

나는 명령이 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주 전 월요일이 되도록 선택했습니다.-ddate

위 스크립트에서 옵션 매개변수 에 사용되는 실제 문자열 -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

관련 정보