Unix tarihi ile 2-3 ay arasında neden bir fark var?


16

Bu nasıl mümkün olur ve bununla nasıl başa çıkarım? Unix'e bağımlı dateve ilginç bir hata keşfettim yedekleme komut dosyası yapıyorum :

[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

Artık yıl / 29 Şubat hatası olabilir mi? dateYine de bir araç gibi olma ihtimali düşük ...
Mark Henderson

Yanıtlar:


44

Yaz saati (yaz saati uygulaması) nedeniyle bu davranışı görüyorsunuz.

Şu anda saatinizin bir saat ileri olduğu yaz aylarında olduğunuz için, üç ay önce Haziran ayının ilk gece yarısından hemen sonra sorduğunuzda, zaman yaz saati üç olmadığı için bir saat "erken" olur. aylar önce.

GNU tarih belgeleri , göreceli günler veya aylar isterken sırasıyla 12:00 öğlen ve ayın 15'ini başlangıç ​​noktası olarak ele almayı önerir . Örneğin:

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

teşekkür ederim. Evet, tam olarak "3 ay önce" 01:00 ile geliyor:[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

Doh! Ben bu datekullanım önerisi göz ardı şüpheli olarak bazı komut dosyaları üzerinden grep gitmek gerektiğini düşünüyorum .
Caleb

14

Mutlak zamanlama birincil kaygınızsa, muhtemelen bu amaç için var olduğu için UTC'den kurtulmak en iyisidir . Michael'ın cevabı, sorunun içinde çalışmanız gerektiğinde çok yararlıdır, ancak tamamen yapabileceğiniz yerden kaçınmak genellikle iyi bir fikirdir.

Sisteminiz varsayılan olarak UTC'ye ayarlanmadığında, saat dilimini iletmenin en basit yolu komutunuza TZortam değişkeniyle önek eklemektir . Bu, bölge anahtarını tek bir komutla sınırlar ve değişkenin sonraki komutlarınıza sızmasını önler.

$ 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

Yapmamanız gereken şeyTZ değişkenin dışa aktarılmasıdır , çünkü aşağıda gösterildiği gibi sorun gidermeyi çok kafa karıştırıcı hale getirebilir.

$ 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

Bilgisayarınızın çalıştırıldığını düşündüğü bu yıl ve "1 ay önce, 2 ay önce ve 3 ay önce" testini seçtiğiniz belirli bir tarihte, evet - muhtemelen 29 Şubat algılamasıdır. Her zaman değil. bir hata, ama ..

Şimdi, bugün 2014-06-01 DEĞİL. Tekrar deneyin. Bilgisayar tarihini 2013-06-01 olarak ayarlayın. Tekrar deneyin.
Bilgisayar tarihini 2014-09-01 olarak ayarlayın. Tekrar deneyin.


6
Tarihleri ​​Amerikan MDYbiçiminde sağlıyorsanız, /ayırmak için es kullanın . Daha da iyisi, burada uluslararası bir topluluk olduğumuz için, uygun ISO tarihlerini kullanın 2014-09-01.
glglgl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.