Текущее время в Лос-Анджелесе 18:05. Но когда я бегу TZ=UTC-8 date --iso=ns
, я получаю:
2013-12-07T10:05:37,788173835+0800
Утилита date сообщает мне, что время 10:05, и даже говорит, что сообщает об этом как UTC + 8. Зачем?
Причина в том, что TZ=UTC-8
интерпретируется как часовой пояс POSIX . В формате часового пояса POSIX 3 буквы обозначают сокращение часового пояса (произвольное), а число - количество часов, в течение которых часовой пояс находится за UTC. Так UTC-8
означает часовой пояс с сокращением UTC, который на 8 часов меньше реального UTC или UTC + 8 часов.
(Это работает так, потому что Unix был разработан в США, который находится за UTC. Этот формат позволяет часовым поясам США быть представленными как EST5, CST6 и т. Д.)
Вы можете увидеть, что происходит на следующих примерах:
$ TZ=UTC-8 date +'%Z %z'
UTC +0800
$ TZ=UTC8 date +'%Z %z'
UTC -0800
$ TZ=FOO-8 date +'%Z %z'
FOO +0800
Формат -0800
часового пояса ISO использует противоположный подход, с -
указанием зоны позади UTC и +
указанием зоны впереди UTC.
TZ=PST+8 date
. Спасибо. Я также нашел это объяснение в разделеman timezone
: «Строка std указывает имя часового пояса и должна состоять из трех или более буквенных символов. Строка смещения следует сразу же за std и указывает значение времени, которое будет добавлено к местному времени, чтобы получить координированное универсальное время ( UTC). Смещение является положительным, если местный часовой пояс находится к западу от премьер-меридиана, и отрицательным, если оно является восточным. Час должен быть между 0 и 24, а минуты и секунды 0 и 59 ».TZ=America/Los_Angeles
. Вы забываете, что тихоокеанское время составляет -7 в летнее время.TZ=:America/Los_Angeles
. Двоеточие указывает, что это файл часового пояса Олсона. А в другом комментарии он упомянул, что хочет игнорировать переход на летнее время, чего не будет.EST-5
CST-6
.Всякий раз, когда вы указываете часовой пояс в формате +/- 00:00, вы указываете смещение , а не фактический часовой пояс. Из
GNU libc
документации (которая соответствует стандарту POSIX):Вот почему это похоже на то, что вы ожидаете.
источник
Why?
Потому что POSIX требует этого .
Таким образом, это даст время около [1]
Los Angeles
(с любой трехбуквенной меткой для текста часового пояса):И это должно дать время рядом
Shanghai, China
илиPerth, Australia
:[1] Близко, потому что может существовать некоторое летнее время, которое сдвигает фактическое «местное время».
источник
В качестве альтернативного метода вы можете использовать команду,
zdump
чтобы показать текущее время в других часовых поясах + смещения.Те же правила применяются к часовым поясам; к западу от основного меридиана "позади", а к востоку "впереди".
пример
$ zdump PST PST Сб 7 декабря 03:25:27 2013 PST
Я сделал этот скрипт, чтобы показать несколько часовых поясов + смещения, которые нам интересны,
zdump
иdate
чтобы мы могли их сравнить.Затем, когда вы запустите его, вы можете увидеть сравнение
zdump
сdate
:источник