답변:
정말 추악하고 아마도 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"
다른 접근법 :
date --date "+$((40-$(date +%V)))weeks last monday" +"%F"
date +%V
반환 41
) 인 경우 --date
매개 변수 값 +-1weeks last monday
은 실제로 7 일이 아닌 2 주 전입니다.
date -d 'last monday'
. 어제 돌아옵니다. 어제 실행했다면 무슨 말을했을까요?
좋아요, 여기 내 시도가 있습니다. 다른 답변에서 아이디어를 훔치고 논리를 더 쉽게 따르려고합니다. 이것은 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" )
}
%V
사용하는 형식 순서 는 ISO 주 번호를보고합니다.