Unixの日付と2〜3か月の間に違いがあるのはなぜですか


16

これはどのように可能ですか、どのように対処しますか?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

うるう年/ 2月29日のバグでしょうか?とはdateいえ、ツールではそうではありません...
マークヘンダーソン

回答:


44

この現象は、夏時間(夏時間)が原因で発生しています。

現在は1時間進んでいる夏時間であるため、3か月前の6月1日の午前0時直後を要求すると、夏時間ではなかったため、時間が1時間早くなります。数か月前。

GNU日付のドキュメントで、相対日または月をそれぞれ要求する場合、開始点として正午と月の15をそれぞれ使用することにより、この問題回避することを提案しています。例えば:

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

ありがとうございました。はい、まさに「3ヶ月前に」01午前でお越し:[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する必要があると思います。
カレブ

14

絶対的なタイミングが主な関心事である場合は、その目的のために存在するUTCを使用するのがおそらく最善です。Michaelの答えは、問題の内部で作業する必要がある場合に非常に役立ちますが、通常はできる限り完全に回避することをお勧めします。

システムがデフォルトでUTCに設定されていない場合、タイムゾーンを渡す最も簡単な方法は、コマンドにTZ環境変数をプレフィックスすることです。これにより、ゾーンスイッチが1つのコマンドに制限され、変数が後続のコマンドに漏れることがなくなります。

$ 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 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.