Почему 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. Зачем?

4 Solutions collect form web for “Почему TZ = UTC-8 производит даты, которые являются 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 (переход на летнее время), что сдвигает фактическое «местное время».

Linux и Unix - лучшая ОС в мире.