Linux Labs

Система изнутри: ресурсы, ядро, процессы / Ступень 11 из 12

Время, часовой пояс и синхронизация

Не запущена Запускается обычно ~20 с
Выйти из урока

Шаг 2 из 7 · на машине · 5 мин

Часы и пояс

У машины одни часы, а показать их время можно в любом поясе.

Ядро хранит время одним числом — секундами с 1 января 1970 года по UTC, всемирному времени без поясов и переводов стрелок. Это число печатает date +%s. Показывая время человеку, программа переводит число по часовому поясу — правилу «сколько часов прибавить к UTC и когда переводить стрелки». Правила всех поясов лежат в /usr/share/zoneinfo, а пояс машины — ссылка /etc/localtime на один из этих файлов.

Переменная окружения TZ подменяет пояс одной программе и тем, кого она запускает:

bash
date; TZ=Europe/Moscow date; date +%s

Первые две строки — один и тот же момент, по UTC и по Москве. Пояс машины и её часы вместе показывает timedatectl: Local time — время в поясе машины, Universal time — по UTC, Time zone — сам пояс, а RTC time — аппаратные часы, по которым машина ставит время при загрузке. Пояс здесь Etc/UTC, поэтому Local time и Universal time совпадают.

Проверь себя 1 вопрос

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 меняет пояс одной программе.
Ubuntu 24.04
Загрузка…