이 두 날짜 명령이 다른 결과를 제공하는 이유는 무엇입니까?


9
$ date -d "Apr 1 2016 - 1 month" +%B

"3 월"을 알려줍니다. 4 월 이전의 달은 3 월입니다. 그러나 내가 이것을하면 :

$ date -d "$(date -d "Apr 1 2016") - 1 month" +%B

그것은 "2 월"을 제공합니다. 이것은 내가 가지고있는 좀 더 복잡한 코드에서 버그를 일으키고 있습니다. 이 두 명령이 다른 결과를 나타내는 이유는 무엇입니까?


둘 다 나에게March
cuonglm

1
Thomas가 설명했듯이 시간대에 따라 다릅니다. 3 월 13 일에 나의 DST 변경 – 귀하의 날짜가 변경되지 않았으므로 같은 날짜에 또는 DST 변경이 없을 경우이 동작이 전혀 나타나지 않을 수 있습니다.
Tal

답변:


11

쉘 추적을 켜서 문제점을 확인할 수 있습니다.

+ date -d 'Apr 1 2016 - 1 month' +%B
March
++ date -d 'Apr 1 2016'
+ date -d 'Fri Apr  1 00:00:00 EDT 2016 - 1 month' +%B
February

내부 date명령 의 출력을 사용하면 4 월 초에 시작되며 한 달을 빼면 EST / EDT 변경으로 인해 불연속이 발생합니다.

+ date -d 'Fri Apr  1 00:00:00 EDT 2016 - 1 month'
Mon Feb 29 23:00:00 EST 2016

물론 결과는 현지 시간대 설정에 따라 다릅니다. 추적을 켜면 시간대가 표시됩니다 (제 경우에는 EDT).

결과가 다른 이유는 후자의 경우 더 많은 정보를 제공 date하여 매개 변수를보다 구체적으로 , 즉 특정 시간으로 설정 했기 때문 입니다. 첫 번째 부분에서는 지정되지 않았으므로 date표시 할 날짜 / 시간을 결정하는 방법에 대한 추가 정보를 제공합니다.


나는 이것이 일광 절약 시간 (광산은 여기에 있습니다 : timeanddate.com/time/zone/canada/edmonton ) 과 관련이 있다는 것을 알고 있지만 여전히 date 명령이 같은 날짜를 다르게 해석하는 것처럼 보이지 않습니다. 기본 셸보다 하위 셸에서 :로 스크립트를 실행 date -d "Apr 1 2016"; date -d "$(date -d "Apr 1 2016")"하면 동일한 시간대 태그를 포함하여 정확히 동일한 결과를 얻 습니다. 왜 두 달을 서로 다른 결과를 제공하지 않습니까?
Tal

아-마지막 편집은 명확합니다. 감사합니다
Tal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.