2 개월에서 3 개월 사이에 Unix 날짜와 다른 이유는 무엇입니까? 처리해야합니까? 유닉스에

이것이 어떻게 가능하며 어떻게 처리해야합니까? 유닉스에 의존하는 백업 스크립트를 만들고 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


답변

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

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

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

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

답변

절대 타이밍이 주요 관심사 인 경우 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

답변

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

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