첫 번째 인수가 1이 아니면 날짜가 이를 잘못 처리합니다.

첫 번째 인수가 1이 아니면 날짜가 이를 잘못 처리합니다.

date (GNU coreutils) 8.22특정 날짜 이후의 날짜를 계산하는 데 문제가 있습니다 .

예를 들어, 2월 1일을 사용하고 싶다고 가정해 보겠습니다.

$ date -d'1 February'
Sun Feb  1 00:00:00 CET 2015

그런 다음 날짜에 일주일을 추가하고 싶습니다. 여태까지는 그런대로 잘됐다:

$ date -d '1 February + 1 week'
Thu Feb  8 00:00:00 LMT 0001

하지만 첫 번째 항목으로 무언가를 추가하면1이 아님, 실패하고 잘못된 콘텐츠를 반환합니다.

$ date -d '1 February + 2 weeks'  # returns as if it was +1 week
Fri Feb  8 00:00:00 LMT 0002      # but Fri instead of Thu, also LMT 0002

그러나 앞에 매개변수를 더 추가하면 작동합니다.

$ date -d '1 February + 0 minutes + 2 week' # works since we added 0/1 unit before
Tue Feb 15 00:01:00 LMT 0000
$ date -d '1 February + 1 minute + 1 day + 1 week' # works fine
Fri Feb  9 00:01:00 LMT 0001
$ date -d '1 February + 1 minute + 25 day + 7 week'  # works since 1st parameter is 1!
Mon Apr 16 00:01:00 LMT 0001

상대 날짜를 제공하는 경우에는 이런 일이 발생하지 않습니다.

$ date -d 'today + 1 week'
Wed Jul  1 12:20:03 CEST 2015
$ date -d 'today + 2 week'    # works fine
Wed Jul  8 12:20:12 CEST 2015

date그러면 첫 번째 매개변수가 항상 1이고 날짜가 특정 날짜와 함께 제공되면 이상한 일이 발생한다고 간주되는 이유는 무엇입니까 ?

답변1

글쎄, 제가 몇 가지 조사를 해보니 첫 번째 숫자가 연도로 해석되었습니다. 이는 +완전히 피상적이고 완전히 무시된 것 같습니다.

귀하의 예를 사용하십시오.

$ date -d'1 February'
Sun Feb  1 00:00:00 CET 2015

연도가 제공되지 않았으므로 예상대로 정확하게 작동합니다.

$ date -d '1 February + 1 week'
Thu Feb  8 00:00:00 LMT 0001

거의 정확해 보이지만 연도가 무시되었기 0001때문에 연도가 다음과 같이 변경되었음을 알 수 있습니다 +. 따라서 명령은 다음과 같이 처리됩니다.

 {1 February 1} {+ 1}{week}
      date      

{+1}은 해당 날짜 이후의 모든 기간에 대한 기본값인 것으로 보입니다.


다른 예는 작동하는 것 같지만 작동하지 않습니다.

$ date -d '1 February + 1 minute + 25 day + 7 week'  # works since 1st parameter is 1!
Mon Apr 16 00:01:00 LMT 0001

보시다시피 연도가 0001로 늘어났습니다. 분은 이미 인용되어 있으므로 기본값인 1만큼 증가합니다. 그런 다음 다른 모든 명령은 날짜의 일부가 아니므로 그에 따라 증가됩니다.


이 방법이 작동한다는 추가 증거로 실제로 작동하는 이 예를 살펴보세요.

$date -d '1 February 4 5 weeks'
Sun Mar  7 00:00:00 LMT 0004

작동 원리와 동일

$date -d '1 February + 4 + 5 weeks'
Sun Mar  7 00:00:00 LMT 0004

즉, 이전에 연도가 지정되지 않은 경우 +는 무시되고 그 뒤의 첫 번째 숫자는 연도로 처리됩니다.

분명히 빼기를 원한다면 명시적으로 말해야 하지만 첫 번째 숫자에 연도를 지정하지 않으면 여전히 무시됩니다.

$date -d '1 February -4 weeks'
Sun Feb  8 00:00:00 LMT 0004
                         ^
                         Year incremented by 4.

매뉴얼 페이지에 지정된 형식으로 사용하는 경우, 즉

$date -d ' Feb 2 -4 weeks'
Mon Jan  5 00:00:00 GMT 2015

그러면 연도 없이 예상대로 정확하게 작동합니다. :)

답변2

두 번째 숫자를 연도로 해석한 다음 1주일을 가정하는 것 같습니다. 따라서 항상 1년을 추가하세요. this year그렇게 하면 원하는 것을 얻을 수 있을 것이라고 생각하기 때문입니다. 예를 들어.

christian@fujiu1404:~$ date -u -d'1 feb this year -2 weeks'
Sun Jan 18 00:00:00 UTC 2015
christian@fujiu1404:~$ date -u -d'1 feb this year +2 weeks'
Sun Feb 15 00:00:00 UTC 2015
christian@fujiu1404:~$ date -u -d'1 feb this year +3 weeks'
Sun Feb 22 00:00:00 UTC 2015

관련 정보