date 명령을 사용하여“월요일 주 40”이되는 날짜를 찾는 방법은 무엇입니까?


11

date 명령을 사용하여 "monday week 40"과 같은 것을 ISO 날짜로 변환하려면 어떻게해야합니까?

나는 이런 식으로 놀고있다 :

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

그리고 내가 검색하는 날짜는 2011-10-03입니다.

그러나 내 문제는이 날짜 문자열이 유효하지 않다는 것이므로이 문제를 해결하려면 다른 접근법이 필요합니다.

/감사


다음 링크는 번호가 매겨진 주 중 어느 요일을 결정하는지에 대한 것 입니다. 주 번호 매기기 (Wikipedia) .. 올해 1 월 1 일이 ISO 주 52에있는 이유를 효과적으로 설명합니다. 'user unknown'이%V 사용하는 형식 순서 는 ISO 주 번호를보고합니다.
— Peter.O

답변:


4

정말 추악하고 아마도 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"

1
외부 날짜를 올바르게 사용할 수 있도록 내부 날짜의 출력 형식을 놓쳤습니다.
— 요한

@Johan, 기본 형식을 사용하는 데 아무런 문제가 없었습니다. 로케일에 따라 다를 수 있습니까? 나는 en_US를 사용합니다. 어쨌든 좋은 지적입니다.
— manatwork

날짜에 스웨덴어 로캘을 사용하므로 차이가 있습니다.
— 요한

로케일 조정에 감사드립니다. 나는 커스텀 데이트 형식을 가지고 있고 같은 문제가 있었다. 나는 그것을 거의 분류했다. 그러나 당신이 그것을 게시했다면 나는 당신의 조정을 사용할 것이다; 더 좋습니다.
— Peter.O

이것이 하나의 라이너가 될 필요는 없었습니다. 설명이 포함 된 임시 변수를 사용하여 작동 방식을 명확히하기 위해 여러 줄로 나누는 것이 좋습니다. 또한 월 1 인, 같은 주 번호 매년 있다고 가정 그렇지 이미 @ Peter.O에서 언급 한 바와 같이.
— Adam Spiers

5

다른 접근법 :

date --date "+$((40-$(date +%V)))weeks last monday"  +"%F"
  • 40은 당신이 검색하는 주입니다
  • 날짜 + % V는 현재 주 (35)를 반환합니다.
  • 40-35 = 5 (추가 할 주 수)
  • 거기서 마지막 월요일을 찾으십시오

좋은 날짜이며 내 맞춤 날짜 설정과 함께 작동합니다.
— Peter.O

이것은 영리한 아이디어이지만 작동하지 않습니다. 예를 들어 오늘이 41 주 월요일에 월요일 (예 :을 date +%V반환 41) 인 경우 --date매개 변수 값 +-1weeks last monday은 실제로 7 일이 아닌 2 주 전입니다.
— Adam Spiers

내가 당신의 비판을 이해하는지 잘 모르겠습니다. 올해는 2013 년이므로 질문의 예가 ​​맞지 않습니다. 질문에 대한 절대 날짜는 무엇이고 대신 내 접근법은 무엇을 반환합니까 (아마도)?
— 사용자가 알 수 없음

@AdamSpiers : 내 달력은 9 월 30 일 월요일, 주 40으로 표시되며, 이는 나의 algo가 오늘 산출 한 것입니다.
— 사용자 알 수 없음

@userunknown 월요일 이후에 오는 화요일 인 오늘 코드를 테스트하기 때문입니다. 어제 코드를 테스트했다면 코드가 깨졌을 것입니다. 보다 명확하게하려면을 실행 해보십시오 date -d 'last monday'. 어제 돌아옵니다. 어제 실행했다면 무슨 말을했을까요?
— Adam Spiers

1

좋아요, 여기 내 시도가 있습니다. 다른 답변에서 아이디어를 훔치고 논리를 더 쉽게 따르려고합니다. 이것은 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" )
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.