У машины одни часы, а показать их время можно в любом поясе.
Ядро хранит время одним числом — секундами с 1 января 1970 года по UTC, всемирному времени без поясов и переводов стрелок. Это число печатает date +%s. Показывая время человеку, программа переводит число по часовому поясу — правилу «сколько часов прибавить к UTC и когда переводить стрелки». Правила всех поясов лежат в /usr/share/zoneinfo, а пояс машины — ссылка /etc/localtime на один из этих файлов.
Переменная окружения TZ подменяет пояс одной программе и тем, кого она запускает:
Первые две строки — один и тот же момент, по UTC и по Москве. Пояс машины и её часы вместе показывает timedatectl: Local time — время в поясе машины, Universal time — по UTC, Time zone — сам пояс, а RTC time — аппаратные часы, по которым машина ставит время при загрузке. Пояс здесь Etc/UTC, поэтому Local time и Universal time совпадают.
date +%s напечатала 1792584000. Что сразу следом напечатает TZ=Asia/Tokyo date +%s?
-
Секунды с 1970 года считаются по UTC и от пояса не зависят:
TZ=Asia/Tokyo dateпокажет другие часы, а+%s— то же число. -
Формат
%sработает в любом поясе и печатает одно и то же число — пояс ему просто не нужен.
Пояс меняет только то, как момент выглядит для человека, а число секунд с 1970 года по UTC у машины одно. Поэтому date +%s с любым TZ печатает одно и то же, а TZ=Asia/Tokyo date без формата — другие часы.
Главное в шаге
- Ядро хранит время как секунды с 1970 года по UTC, а пояс только переводит их в часы и минуты для человека.
-
Пояс машины — ссылка
/etc/localtime, её видно вtimedatectl; переменнаяTZменяет пояс одной программе.