date 명령을 사용하여 "40주차 월요일" 날짜를 어떻게 알 수 있나요?

date 명령을 사용하여 "40주차 월요일" 날짜를 어떻게 알 수 있나요?

date 명령을 사용하여 "40번째 주 월요일"과 같은 날짜를 ISO 날짜로 어떻게 변환합니까?

나는 다음과 같이 놀고 있습니다 :

date --date='monday week 40' +'%Y-%m-%d'

검색하려는 날짜는 2011-10-03 입니다.

하지만 제 문제는 이 날짜 문자열이 유효하지 않다는 것입니다. 따라서 이 문제를 해결하려면 다른 방법이 필요합니다.

/감사해요

답변1

또 다른 방법:

date --date "+$((40-$(date +%V)))weeks last monday"  +"%F"
  • 40은 당신이 검색한 주입니다.
  • date +%V는 이번 주를 반환합니다(35).
  • 40-35 = 5, 추가할 주 수입니다.
  • 거기서 마지막 월요일을 찾아보세요

답변2

정말 보기 흉하며 아마도 GNU에서만 작동할 것입니다 date:

date -d "$( date -d "$( date +'%Y-01-01' ) +40 weeks") -$( date -d "$( date +'%Y-01-01' ) +40 weeks" +'%w' ) days+1 day" +'%Y-%m-%d'

10월 3일에만 테스트되었으며 다른 경우에는 실패할 수 있습니다.


고쳐 쓰다: 영어가 아닌 로캘이 있는 경우 이 작업을 시작하려면 내부 날짜의 출력을 지정해야 합니다. (%F는 단지 YYYY-MM-DD입니다).

date -d "$(date -d "$(date +'%Y-01-01') +40 weeks" +"%F") -$(date -d "$(date +'%Y-01-01') +40 weeks" +%w) days +1 day" +"%F"

답변3

좋습니다. 제가 시도한 내용은 다음과 같습니다. 다른 답변에서 아이디어를 훔치고 논리를 더 쉽게 이해하려고 노력합니다. 이는 ISO 8601 시스템을 기반으로 하므로 미국이나 캐나다 같은 국가에 거주하는 경우 정확하지 않지만 해당 국가에서는 쉽게 조정할 수 있습니다.

# sets $week_start to a representation of Monday of the given week
# number formatted via the given format, and similarly sets
# $week_end to Friday of the same week.
get_week_range () {
    week_num="$1" date_format="$2"

    # Most of the world adhere to ISO 8601 which states that weeks begin on Monday
    # and Jan 4th is always in week #1:
    #
    #   http://en.wikipedia.org/wiki/ISO_week_date
    #
    # For other week numbering systems (e.g. USA, Canada), see:
    #
    #   http://en.wikipedia.org/wiki/Seven-day_week#Week_numbering
    day_in_week_1=$( date +'%Y-01-04' )
    day_num_in_week_1=$( date -d $day_in_week_1 +%u ) # 1 is Monday
    days_from_week_1_start=$(( $day_num_in_week_1 - 1 ))
    # This is a Monday:
    start_of_week_1=$( date -d "$day_in_week_1 - $days_from_week_1_start days" +%F )

    week_delta="$(( $week_num - 1 ))"
    # Monday:
    week_start=$( date -d "$start_of_week_1 + $week_delta weeks"          +"$date_format" )
    # Friday:
    week_end=$(   date -d "$start_of_week_1 + $week_delta weeks + 4 days" +"$date_format" )
}

관련 정보