Как сказал @Gilles, BST — это то, что выводится на date
/ date +%Z
, чтобы сообщить пользователям, что это дата по британскому летнему времени (, поэтому GMT+1 )не определяет часовой пояс., а не то, что вы можете использовать для $TZ
.
Этот BST важен для британских пользователей. Когда британский пользователь видит 14:00 BST
, он знает, что отметка времени относится к 14 :00 по летнему времени в континентальной Великобритании (, то есть к 13 :00 UTC ). Использование этих 3 -4 буквенных кодов широко распространено в Великобритании, США и некоторых других англоязычных странах, поэтому в выводе по умолчанию отображается date
там (в en_GB.UTF-8
локалях, например ). С другой стороны, большинство французских пользователей понятия не имеют, что 14:00 CEST
означает (, хотя CEST
относится к центральноевропейскому летнему времени , GMT+2, которое применяется летом во Франции ). ],поэтому вы заметите, что когда даты указывают часовой пояс, они скорее включают смещение UTC, чем CET
/ CEST
там (напримерmardi 2 mai 2017, 13:34:09 (UTC+0200)
).
Переменная $TZ
не должна содержать эти 3 -4-буквенных кода. Он содержит то, что определяет / определяет часовой пояс, регион, в котором вы находитесь. Приложения используют его, чтобы узнать смещение относительно UTC в любой момент времени, когда переключаться между Зимним и Летнее время и какой код (если есть )для Зимнего и Летнего времени будет отображаться пользователю (для тех пользователей, для которых это значимо ).
Для этого вы можете установить TZ
на некоторую системную -спецификацию часового пояса. Подобно TZ=:Europe/London
(, хотя многие системы также принимают TZ=Europe/London
, а также )или содержат TZ
полные правила (, хотя эти правила ограничены ).
Например, если я использую TZ=:Europe/London
в своей системе, то правила будут считываться из /usr/share/zoneinfo/Europe/London
.
В этом файле будет указано, например, что с 1996 года смещение от UTC равно 0 от последнего воскресенья октября в 2 часа ночи UTC до последнего воскресенья марта (с именем GMT для «Среднего времени по Гринвичу» )и 1 по другому мудрому (с именем BST для «британского летнего времени» ), в то время как для 1970 (0 времени Unix )по 1972 год было 1 круглый год с именем BST для «британского стандарта». Время".
Вы уже видите, что нет смысла использовать BST в качестве спецификации часового пояса. Во-первых, это означало разные вещи в разные моменты времени, и даже если мы рассматриваем только текущую эпоху, это всего лишь код для летнего времени, поэтому его нельзя использовать в качестве спецификации часового пояса для всего года.
Теперь вы также можете включить TZ
в полные правила. Например, для «британского стандарта (, а не летнего )времени» начала 70-х годов,можно использовать простейшую форму спецификации:
TZ=BST-1
Указывает часовой пояс, который всегда находится на 1 час восточнее UTC и для которого date +%Z
всегда возвращает BST
. Этот часовой пояс является правильным для континентальной Британии в начале 70-х годов и для летнего времени с 1972 года, но не для зимнего времени с 1972 года (, и мы не можем сказать на будущее ).
Или вы можете использовать полную спецификацию текущих правил:
TZ=GMT0BST,M3.5.0/1:00:00,M10.5.0/2:00:00
Это говорит о том, что в году есть два периода, один из которых называется GMT со смещением 0, а другой BST со смещением 1 (подразумевается как 0+1 выше, если не указано иное ), где переключатель от одного до другого в последнее (5 )воскресенье (0 )марта (3 )в 1 :00 :00 UTC и обратно в последнее воскресенье октября в 2 :00.
Опять же, что TZ работает с 1996 года по настоящее время, но не обязательно иначе. Например, для 1970 -01 -01 00 :00 :00 UTC (0 время эпохи Unix, когда местное время было 1 :00 :00 BST (Британский Стандартное время )в Лондоне):
$ TZ=:Europe/London date -d @0
Thu 1 Jan 01:00:00 BST 1970
$ TZ=GMT0BST,M3.5.0/1:00:00,M10.5.0/2:00:00 date -d @0
Thu 1 Jan 00:00:00 GMT 1970
Согласно POSIX , поведение для
TZ=BST-1
хорошо определен (как описано выше)TZ=BST
(или TZ=GMT
/ TZ=UTC
/TZ=Europe/London
)не указано. TZ=:BST
/ TZ=:Europe/London
— это реализация, определенная . То есть системы предназначены для его поддержки и документирования того, что он делает, хотя POSIX не говорит нам, что это делается. В третьем случае выше, в системах GNU (и, я думаю, в большинстве других Unix -подобных системах ), когда TZ
начинается с :
, то, что следует за этим, принимается как путь к файл определения часового пояса. В случае системы GNU это также имеет место, когда :
опущено (, даже если значение формирует допустимую спецификацию часового пояса, например UTC0
, но обычно таких файлов не должно существовать,хотя я вижу некоторые исключения в моей системе, которые делают ее не -системой POSIX (, например, TZ=CST6CDT date -d 1943-01-01 +%Z
выводит CWT
вместо CST
, потому что есть /usr/share/zoneinfo/CST6CDT
файл 1 который определяет военное время для этого периода )).
Этот путь, как правило, является относительным путем, и в этом случае он относится к$TZDIR
(или некоторому значению по умолчанию, например /usr/share/zoneinfo
, когда $TZDIR
не установлено, как это обычно бывает ). По соображениям безопасности $TZDIR
, абсолютный путь или относительные пути с компонентами ..
игнорируются в контекстах повышения привилегий (, как и в контекстах setuid ).
Обычно в системе GNU TZ=:BST
, как и TZ=BST
, обычно ищет файл /usr/share/zoneinfo/BST
. Если не найдено (, как это было бы в случае, поскольку BST
не может идентифицировать определение часового пояса ), обычно предполагается время UTC и имя часового пояса (, как в date +%Z
вывод )из BST
.
1 Такие CST6CDT
, как WET
, CET
, MET
... являются пережитками из другого времени. В конце 1993 года база данных TZ (, как и сейчас , поддерживаемая IANA ), изменилась с использования специальных (и чаще всего двусмысленных )имен (, таких как MET
, GB-Eire
, отWET
)до Area/City
где город является самым густонаселенным городом (на момент выпуска )где применяется зона (Площадь представляет собой большие области, такие как континент/океан ). Для континентальной Британии, где раньше использовался GB-Eire
(, а не WET ), теперь (с 1993 г. )используется Europe/London
. GB-Eire
(, как и WET
), все еще доступны для обратной совместимости(GB-Eire
теперь ссылаются на Europe/London
, в то время как WET
определяется как зона, использующая UTC зимой, и правила ЕС для перехода на летнее время (Великобритания только следует правила ЕС с 1996 года, и теперь, когда Великобритания покидает ЕС, никто не может сказать, что ждет нас в будущем )), но не следует использовать сейчас в новых развертываниях.
Не то, чтобы я мог видеть.
Но между [[ val1 < val2 ]]
и(( val1 < val2 ))
:есть разница: первое — это сравнение строк.
$ [[ 2 -lt 007 ]] && echo true || echo false
true
$ [[ 2 < 007 ]] && echo true || echo false
false
$ (( 2 < 007 )) && echo true || echo false
true
Хотя ведущие нули по-прежнему представляют проблему в обоих случаях:
$ (( 20 < 021 )) && echo true || echo false
false
$ [[ 20 -lt 021 ]] && echo true || echo false
false
Это потому, что они отмечают восьмеричные числа, как в C. Но вы предотвращаете это, добавляя к ним префикс 10#
.(Справочник по Bash 6.5 Арифметика оболочки)
$ (( 10#20 < 10#021 )) && echo true || echo false
true