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" )
}