Что `date -u -d" TZ = "MET" 2020-03-29 02:01:00 "` означает для даты Gnu? - PullRequest
0 голосов
/ 06 марта 2020

Читая «Летнее время», «Часовые пояса» и команду «gnu date», я многому научился.

Например, если я хочу преобразовать точку времени в Сиднее в время, которое было в Нью-Йорке, я используйте "TZ =" внутри строки даты и среды . Удивительно.

Итак, я узнал, что если я хочу, чтобы переход на летнее время в Берлине рассматривался как UT C, то я не буду использовать часовой пояс как часть даты:

$ for hh in 00 01 02 03 04 05 ; do d="2020-03-29 $hh:01:00 MET" ; date -u -d "$d" | xargs echo "$d => UTC:" ; done
2020-03-29 00:01:00 MET => UTC: Sat Mar 28 23:01:00 UTC 2020
2020-03-29 01:01:00 MET => UTC: Sun Mar 29 00:01:00 UTC 2020
2020-03-29 02:01:00 MET => UTC: Sun Mar 29 01:01:00 UTC 2020
2020-03-29 03:01:00 MET => UTC: Sun Mar 29 02:01:00 UTC 2020
2020-03-29 04:01:00 MET => UTC: Sun Mar 29 03:01:00 UTC 2020
2020-03-29 05:01:00 MET => UTC: Sun Mar 29 04:01:00 UTC 2020

Это необходимо будет неправильный результат, потому что часы непрерывны. И я понимаю, почему это так: потому что «MET» фиксируется на UTC + 1 и не учитывает переключение. Что-то верно для «MEST»:

$ for hh in 00 01 02 03 04 05 ; do d="2020-03-29 $hh:01:00 MEST" ; date -u -d "$d" | xargs echo "$d => UTC:" ; done
2020-03-29 00:01:00 MEST => UTC: Sat Mar 28 22:01:00 UTC 2020
2020-03-29 01:01:00 MEST => UTC: Sat Mar 28 23:01:00 UTC 2020
2020-03-29 02:01:00 MEST => UTC: Sun Mar 29 00:01:00 UTC 2020
2020-03-29 03:01:00 MEST => UTC: Sun Mar 29 01:01:00 UTC 2020
2020-03-29 04:01:00 MEST => UTC: Sun Mar 29 02:01:00 UTC 2020
2020-03-29 05:01:00 MEST => UTC: Sun Mar 29 03:01:00 UTC 2020

Итак, способ сделать это - а) использовать «Европа / Берлин», а не MET или MEST и б) предоставить TZ = внутри строки даты.

Вот и вот:

$ for hh in 00 01 02 03 04 05 ; do d="TZ=\"Europe/Berlin\" 2020-03-29 $hh:01:00" ; date -u -d "$d" | xargs echo "$d => UTC:" ; done
TZ="Europe/Berlin" 2020-03-29 00:01:00 => UTC: Sat Mar 28 23:01:00 UTC 2020
TZ="Europe/Berlin" 2020-03-29 01:01:00 => UTC: Sun Mar 29 00:01:00 UTC 2020
date: invalid date ‘TZ="Europe/Berlin" 2020-03-29 02:01:00’
TZ="Europe/Berlin" 2020-03-29 02:01:00 => UTC:
TZ="Europe/Berlin" 2020-03-29 03:01:00 => UTC: Sun Mar 29 01:01:00 UTC 2020
TZ="Europe/Berlin" 2020-03-29 04:01:00 => UTC: Sun Mar 29 02:01:00 UTC 2020
TZ="Europe/Berlin" 2020-03-29 05:01:00 => UTC: Sun Mar 29 03:01:00 UTC 2020

Это немного странно, потому что в отличие от "MET" я не могу просто поставить "Europe / Berlin" после времени для -d. Но хорошо.

Теперь самое смешное. Я также могу поставить "MET" с "TZ =" внутри строки даты:

$ for hh in 00 01 02 03 04 05 ; do d="TZ=\"MET\" 2020-03-29 $hh:01:00" ; date -u -d "$d" | xargs echo "$d => UTC:" ; done
TZ="MET" 2020-03-29 00:01:00 => UTC: Sat Mar 28 23:01:00 UTC 2020
TZ="MET" 2020-03-29 01:01:00 => UTC: Sun Mar 29 00:01:00 UTC 2020
date: invalid date ‘TZ="MET" 2020-03-29 02:01:00’
TZ="MET" 2020-03-29 02:01:00 => UTC:
TZ="MET" 2020-03-29 03:01:00 => UTC: Sun Mar 29 01:01:00 UTC 2020
TZ="MET" 2020-03-29 04:01:00 => UTC: Sun Mar 29 02:01:00 UTC 2020
TZ="MET" 2020-03-29 05:01:00 => UTC: Sun Mar 29 03:01:00 UTC 2020

Гм ... переход на летнее время? Хорошо...? и MEST?

$ for hh in 00 01 02 03 04 05 ; do d="TZ=\"MEST\" 2020-03-29 $hh:01:00" ; date -u -d "$d" | xargs echo "$d => UTC:" ; done
TZ="MEST" 2020-03-29 00:01:00 => UTC: Sun Mar 29 00:01:00 UTC 2020
TZ="MEST" 2020-03-29 01:01:00 => UTC: Sun Mar 29 01:01:00 UTC 2020
TZ="MEST" 2020-03-29 02:01:00 => UTC: Sun Mar 29 02:01:00 UTC 2020
TZ="MEST" 2020-03-29 03:01:00 => UTC: Sun Mar 29 03:01:00 UTC 2020
TZ="MEST" 2020-03-29 04:01:00 => UTC: Sun Mar 29 04:01:00 UTC 2020
TZ="MEST" 2020-03-29 05:01:00 => UTC: Sun Mar 29 05:01:00 UTC 2020

Ошибка ... полное недоумение. Почему нет ошибки? Что здесь происходит?

Итак, мои вопросы: Что означают три места для часовых поясов

  • как часовой пояс после строки даты
  • TZ=... внутри строки даты
  • переменная среды TZ=... за пределами date (здесь не показано)

означает точно для даты GNU?

И что означает

  • MET
  • MEST
  • Европа / Берлин

для даты GNU в тех местах ? Похоже, что в разных местах они имеют различное понимание, например, MEST в качестве суффикса даты и времени или TZ = MEST внутри строки даты.

...