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