Intereting Posts
Grub-install: внедрение в Bios / GPT невозможно Какую роль играет krb5.conf при подключении Linux-машины к AD через Samba / winbind? Разница между диспетчером окон и рабочей средой? Как установить версию gcc по умолчанию только для одного пользователя Есть ли какая-либо переменная env для включения –color (и т.п.) для всех команд? Gmail мгновенный новый почтовый уведомитель для систем Debian 7? В чем разница между ioremap и файловой операцией mmap? Escape текст для дальнейшего перехода к зениту Удалите все файлы в каталоге, имя которого не соответствует строке в списке файлов. Вернитесь к оболочке входа по умолчанию после запуска / bin / bash Присоединение файлов с путаницей кошки Дайте доступ только к одному каталогу, который не является домашним пользователем. Как отобразить всю строку сюжета в `mail`? tmux – Catch 22 с «неизвестным ключом: WheelUpPane» для osx и Ubuntu Как я могу быть уверен, что доступ к моему домашнему серверу из моей домашней сети не осуществляется через Интернет?

Почему TZ = UTC-8 производит даты, которые являются UTC + 8?

Текущее время в Лос-Анджелесе – 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 три буквы являются сокращением временного интервала (что является произвольным), а число – это количество часов, на которые указывает часовой пояс за 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 -0800 принимает противоположный подход: с указанием зоны за UTC и + указывающей, что зона опережает UTC.

Всякий раз, когда вы указываете часовой пояс в формате +/- 00:00, вы указываете смещение , а не фактический часовой пояс. Из документации GNU libc (которая следует за стандартом POSIX):

Смещение задает значение времени, которое вы должны добавить в локальное время, чтобы получить значение координированного универсального времени. Он имеет синтаксис, подобный [+ | -] hh [: mm [: ss]]. Это положительно, если местный часовой пояс к западу от Главного Меридиана и отрицательный, если он находится на востоке. Время должно составлять от 0 до 23, а минуты и секунды между 0 и 59.

Вот почему это похоже на то, что вы ожидаете.

В качестве альтернативного метода вы можете использовать команду zdump чтобы отображать текущее время в других часовых поясах + смещения.

Zdump печатает текущее время в каждом имени зоны, названном в командной строке.

Те же правила применяются к часовым поясам; к западу от основного меридиана, «отстающего», а на востоке «впереди».

пример

$ zdump PST PST Sat Dec 7 03:25:27 2013 PST

Я сделал этот скрипт, чтобы показать несколько часовых zdump + смещения, которые нам интересны в использовании zdump и date чтобы мы могли их сравнить.

 $ cat cmd.bash #!/bin/bash printf "\ndate: %s\n\n" "$(date)" for tz in EST PST PST+8 PST-8 UTC UTC+8 UTC-8; do echo "-- timezone $tz" printf "zdump: %s\n" "$(zdump $tz)" printf "date: %s\n" "$(TZ=$tz date +'%a %b %d %T %Y - (%Z %z)')" echo "" done 

Затем, когда вы запустите его, вы можете увидеть сравнение zdump на date :

 $ ./cmd.bash date: Sat Dec 7 02:59:05 EST 2013 -- timezone EST zdump: EST Sat Dec 7 02:59:05 2013 EST date: Sat Dec 07 02:59:05 2013 - (EST -0500) -- timezone PST zdump: PST Sat Dec 7 07:59:05 2013 PST date: Sat Dec 07 07:59:05 2013 - (PST +0000) -- timezone PST+8 zdump: PST+8 Fri Dec 6 23:59:05 2013 PST date: Fri Dec 06 23:59:05 2013 - (PST -0800) -- timezone PST-8 zdump: PST-8 Sat Dec 7 15:59:05 2013 PST date: Sat Dec 07 15:59:05 2013 - (PST +0800) -- timezone UTC zdump: UTC Sat Dec 7 07:59:05 2013 UTC date: Sat Dec 07 07:59:05 2013 - (UTC +0000) -- timezone UTC+8 zdump: UTC+8 Fri Dec 6 23:59:05 2013 UTC date: Fri Dec 06 23:59:05 2013 - (UTC -0800) -- timezone UTC-8 zdump: UTC-8 Sat Dec 7 15:59:05 2013 UTC date: Sat Dec 07 15:59:05 2013 - (UTC +0800) 

Why?

Потому что POSIX требует этого .

Если предшествует «-», часовой пояс будет к востоку от Главного Меридиана; в противном случае он должен быть на западе (что может указываться необязательным предшествующим «+»).

Итак, это даст время около [1] Los Angeles (с любой 3-х буквенной меткой для текста часового пояса):

 $ TZ=ANY8 date "+%Y-%m-%d %H:%M:%S %Z%z" 2016-04-23 10:47:12 ANY-0800 $ TZ=GMT+8 date "+%Y-%m-%d %H:%M:%S %Z%z" 2016-04-23 10:47:12 GMT-0800 

И это должно дать время около Shanghai, China или Perth, Australia :

 $ TZ=ANY-8 date "+%Y-%m-%d %H:%M:%S %Z%z" 2016-04-24 02:47:12 ANY+0800 $ TZ=CST-8 date "+%Y-%m-%d %H:%M:%S %Z%z" 2016-04-23 02:47:12 CST+0800 

[1] Близко, потому что может быть какое-то DST (переход на летнее время), что сдвигает фактическое «местное время».