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.