2 개월에서 3 개월 사이에 Unix 날짜와 다른 이유는 무엇입니까?


16

이것이 어떻게 가능하며 어떻게 처리해야합니까? 유닉스에 의존하는 백업 스크립트를 만들고 date흥미로운 버그를 발견했습니다.

[root@web000c zfs_test]# date +%y-%m-%d --date='2 months ago'
14-04-01
[root@web000c zfs_test]# date +%y-%m-%d --date='3 months ago'
14-02-28
[root@web000c zfs_test]# date
Sun Jun  1 00:08:50 CEST 2014

윤년 / 2 월 29 일 버그 일 수 있습니까? 아마 같은 도구에서 date...
마크 헨더슨

답변:


44

서머 타임 (일광 절약 시간)으로 인해이 동작이 나타납니다.

현재 시계가 1 시간 앞서있는 여름 시간에 있기 때문에 6 월 1 일 자정 직후에 3 개월 전에 요청하면 시간이 여름 시간이 아니기 때문에 1 시간 "이전"이됩니다. 몇달 전.

GNU 날짜 문서 상대 요일 또는 월을 요청할 때 12:00 정오와 매월 15 일을 시작점으로 사용 하여이 문제를 해결하도록 제안합니다 . 예를 들면 다음과 같습니다.

date +%y-%m-%d --date="$(date +%Y-%m-15) -3 month"

감사합니다. 네, 정확히 "3 개월 전"오전 1 시쯤에 올 것입니다 :[root@web000c zfs_test]# date +%y-%m-%d --date='3 months ago' 14-03-01 [root@web000c zfs_test]# date Sun Jun 1 01:00:15 CEST 2014
Shirker

도! date사용법 에 대한이 제안을 간과 한 것으로 의심되므로 일부 스크립트를 통해 grep해야한다고 생각 합니다.
Caleb

14

절대 타이밍이 주요 관심사 인 경우 UTC 가 해당 용도로 존재하기 때문에 작동하는 것이 가장 좋습니다 . Michael의 답변은 문제 내부에서 작업해야 할 때 매우 유용하지만 일반적으로 가능한 한 완전히 피하는 것이 좋습니다.

시스템이 기본적으로 UTC로 설정되어 있지 않은 경우 시간대를 전달하는 가장 간단한 방법은 명령 앞에 TZ환경 변수를 붙이는 것 입니다. 이것은 영역 스위치를 단일 명령으로 제한하고 변수가 후속 명령으로 누출되지 않도록합니다.

$ NOW=$(date '+%s')
$ date -d @$NOW
Wed Jun 11 23:44:35 EDT 2014
$ TZ=UTC date -d @$NOW
Thu Jun 12 03:44:35 UTC 2014

당신이 하지 말아야 할 것은 수출이다 TZ이 매우 문제를 해결하는 데 혼란 일을 할 수있는 다음이 보여으로, 변수를.

$ export TZ=UTC
$ date -d @$NOW
Thu Jun 12 03:44:35 UTC 2014
$ TZ=EDT date -d @$NOW
Thu Jun 12 03:44:35 EDT 2014

-3

이 특정 해에 컴퓨터가 작동한다고 생각하고 "1 개월 전, 2 개월 전 및 3 개월 전에 테스트를 위해 선택한 특정 날짜에 예, 2 월 29 일 탐지 일 가능성이 높습니다. 오류가 있지만 ..

현재는 2014-06-01이 아닙니다. 다시 시도하십시오. 컴퓨터 날짜를 2013-06-01로 설정하십시오. 다시 시도하십시오.
컴퓨터 날짜를 2014-09-01로 설정하십시오. 다시 시도하십시오.


6
미국 MDY형식의 날짜를 제공하는 경우 /분리를 위해 es를 사용하십시오 . 더 나은 것은 우리가 여기에 국제 커뮤니티이기 때문에와 같은 적절한 ISO 날짜를 사용하는 것 2014-09-01입니다.
glglgl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.