Operacje arytmetyczne w dniu bash… ¿są odwrócone?

2

Edycja: za pomocą Amazon Linux:

Linux ip-xx-xx-xx-xxx 3.14.44-32.39.amzn1.x86_64 # 1 SMP czw. 11 czerwca 20:33:38 UTC 2015 x86_64 x86_64 x86_64 GNU / Linux


Dane wyjściowe tego polecenia:

date +"%Y-%m-%d %H:%M:%S" --date="2015-07-27 00:11:22"

27.07.2015 00:11:22

Dane wyjściowe tego polecenia:

date +"%Y-%m-%d %H:%M:%S" --date="2015-07-27 00:11:22 + 00:05"

27.07.2015 00:06:22

Dane wyjściowe tego polecenia:

date +"%Y-%m-%d %H:%M:%S" --date="2015-07-27 00:11:22 - 00:05"

27.07.2015 00:16:22

OMFG czy czas płynie wstecz? Lub problem z 8 warstwą?

Edycja : Mój Amazon Linux jest w UTC + 00: 00, a moja lokalna maszyna Ubuntu jest w UTC-05: 00. Te same polecenia w Ubuntu pokazują:

26.07.2015, 19:11:22

26.07.2015, 19:06:22

26.07.2015, 19:16:22

odpowiednio, więc + 00:05nie wydaje się być strefą czasową.

Luis Masuelli
źródło
1
Ten sam problem dotyczy mojego Gentoo. Sprawdzam źródła „coreutils”, aby uzyskać więcej szczegółów.
Adrien M.
1
Liczby po +/ -średniej strefie czasowej, więc --date="2015-07-27 00:11:22 + 00:05"oznaczają datę wydruku 2015-07-27 00:11:22 w strefie czasowej, która jest 5 minut na zachód od UTC , tj. 5 minut wcześniej: 00:06:22.
jimmij
Chcę wykonać arytmetykę daty. Jak mam to zrobić?
Luis Masuelli
Czekać! W mojej maszynie Ubuntu pojawia się „2015-07-26 19:16:22”. Oznacza to, że 00:05 nie jest
strefą
@LuisMasuelli drukuj datę jako liczbę sekund od epoki Uniksa z '+% s', chwyć ją w zmiennej z podstawieniem poleceń i wykonuj arytmetykę w normalny sposób, używając (())(podwójnego nawiasu) w bash.
jimmij

Odpowiedzi:

2

Według źródła parsowania datetime.y gnulib wydaje się, że jest to funkcja związana z funkcją time_zone_hhmm .

Po pierwsze, nie możemy użyć twojego formatu, aby dodać sekundy date +"%Y-%m-%d %H:%M:%S" --date="2015-07-27 00:11:22 - 00:05:01":, mam błąd analizy:

date: invalid date ‘2015-07-27 00:11:22 - 00:05:01’

Następnie, zgodnie z nagłówkiem funkcji time_zone_hhmm:

/* Convert a time zone expressed as HH:MM into an integer count of
minutes.  If MM is negative, then S is of the form HHMM and needs
to be picked apart; otherwise, S is of the form HH.  As specified in
http://www.opengroup.org/susv3xbd/xbd_chap08.html#tag_08_03, allow
only valid TZ range, and consider first two digits as hours, if no
minutes specified.  */

Wygląda na to, że modyfikujesz strefę czasową, która odpowiada zachowaniu odwróconego czasu dodawania / usuwania.

Jeśli chcesz wykonać artmetykę na czas, lepiej użyj znaczników czasu Epoki (data + '% s'), na których łatwiej jest wykonać obliczenia. Ponadto są oparte na czasie UTC, który nie uwzględnia lokalnej strefy czasowej serwera, nad którym pracujesz.

Znacznik czasu zwróci zatem ten sam wynik dla USA, Azji lub Europy. Następnie używasz tego znacznika czasu do wyświetlania czasu czytelnego dla człowieka, co uwzględnia strefę czasową.

W każdym razie niezły chwyt. Bez tej fajnej sztuczki nigdy nie wykopałbym źródła gnulib!

Adrien M.
źródło