Dlaczego istnieje różnica w stosunku do daty uniksowej między 2 a 3 miesiącami


16

Jak to możliwe i jak sobie z tym poradzić? Tworzę skrypt kopii zapasowej zależny od Uniksa datei odkryłem interesujący błąd:

[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

Czy to może być błąd roku przestępnego / 29 lutego? Mało prawdopodobne w takim narzędziu jak date...
Mark Henderson

Odpowiedzi:


44

Widzisz to zachowanie z powodu czasu letniego (czas letni).

Ponieważ jesteś obecnie w okresie letnim, gdzie twój zegar jest o godzinę do przodu, kiedy poprosisz o trzy miesiące temu tuż po północy pierwszego czerwca, czas kończy się o godzinę „wcześniej”, ponieważ nie była to godzina trzecia miesiące temu.

Dokumentacja daty GNU sugeruje obejście tego problemu, używając godziny 12:00 i 15 miesiąca jako punktu wyjścia, gdy pytamy odpowiednio o względne dni lub miesiące. Na przykład:

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

Dziękuję Ci. Tak, dokładnie „3 miesiące temu” o [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
01:00

Doh! Myślę, że muszę przejrzeć niektóre z moich skryptów, ponieważ podejrzewam, że przeoczyłem tę sugestię dotyczącą dateużycia.
Caleb

14

Jeśli najważniejszy jest czas bezwzględny, prawdopodobnie najlepiej jest zrezygnować z UTC, ponieważ istnieje w tym celu. Odpowiedź Michaela jest bardzo przydatna, gdy musisz zająć się problemem, ale zazwyczaj dobrym pomysłem jest unikanie go całkowicie tam, gdzie możesz.

Gdy twój system nie jest ustawiony domyślnie na UTC, najprostszym sposobem na przekazanie strefy czasowej jest poprzedzenie polecenia TZzmienną środowiskową. Ogranicza to przełączenie strefy do pojedynczego polecenia i zapobiega wyciekaniu zmiennej do kolejnych poleceń.

$ 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

To, czego nie powinieneś robić, to wyeksportować TZzmienną, ponieważ może to bardzo skomplikować rozwiązywanie problemów, jak pokazano poniżej.

$ 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

W tym konkretnym roku, w którym komputer myśli, że jest uruchomiony, i w konkretnym dniu, który wybrałeś do testu „1 miesiąc temu, 2 miesiące temu i 3 miesiące temu, tak - prawdopodobnie wykrycie to nastąpi 29 lutego. Nie zawsze błąd, ale ...

Teraz dzisiaj NIE jest 2014-06-01. Spróbuj ponownie. Ustaw datę komputera na 01.01.2013. Spróbuj ponownie.
Ustaw datę komputera na 01.01.2014. Spróbuj ponownie.


6
Jeśli podajesz daty w MDYformacie amerykańskim , użyj /es do rozdzielenia. Co więcej, ponieważ jesteśmy tu społecznością międzynarodową, używaj odpowiednich dat ISO, takich jak 2014-09-01.
glglgl
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.