Кто-то знает, а кто-то и нет, но время в формате Unix - это количество секунд, прошедших с полуночи по UTC 1 января 1970 года. Почему так? Да просто так исторически сложилось. И почти все Unix-based системы следуют этому правилу. Если интересно почитать лонгрид, то найти его можно по ссылке, здесь же я изложу краткие, но необходимые сведения.
Исходя из вышесказанного можно предположить, что время на любом компьютере с ОС GNU/Linux будет всегда одинаковым и это предположение будет верным, при условии, что оно правильно установлено. Время в ОС зависит от трёх вещей:
- Системное время;
- Аппаратное время;
- Временные зоны.
Системное время — это время, которое используется операционной системой для всех операций и вычислений. Это время поддерживается ядром операционной системы.
Аппаратное время (RTC) - Аппаратное время или время реального времени (Real-Time Clock, RTC) хранится в аппаратной памяти на материнской плате. Оно поддерживается небольшой батареей, которая позволяет часам работать даже тогда, когда компьютер выключен. При запуске системы операционная система читает время с RTC и устанавливает системное время. Аппаратные часы хранят время в формате, удобном для непосредственного использования. Обычно это двоично-десятичный код (BCD), который хранит значения для года, месяца, дня, часов, минут и секунд. Формат:
- BCD (Binary-Coded Decimal): Каждый десятичный разряд времени представлен в виде 4-битного числа. Пример: Время 12:34:56 будет представлено как 0x12 0x34 0x56.
Временные зоны Linux использует базу данных временных зон (tzdata), чтобы корректно отображать время в разных географических регионах. Временные зоны определяются файлом /etc/localtime, который обычно является символической ссылкой на файл в каталоге /usr/share/zoneinfo.
То есть время в формате Unix на компьютере всегда представлено в одном виде — как количество секунд, прошедших с 1 января 1970 года в UTC. Это время является абсолютным и не зависит от часового пояса. Когда меняется часовой пояс, изменяется только способ отображения этого времени для пользователя, чтобы оно соответствовало местному времени.
К практике! Есть две утилиты, которые позволяют просматривать или управлять времнем в ОС GNU/Linux:
- date;
- hwclock. date - утилита для работы с системным временем.
date # Отображает текущую дату и время
date -s "2023-12-31 23:59:59" # Устанавливает системное время
date -d @1712341423 # Переводит Unix-time в человекочитаемый вид
date +%s # Посмотреть текущее время в Unix-time
date -u # Показать текущее время в формате
TZ='Asia/Tokyo' date # Изменить часовой пояс для данной командной строки
# Форматирование выводимой даты
date +"%Y-%m-%d" # Вывод: 2024-07-31
date +"%H:%M:%S" # Вывод: 15:26:40
date +"%A, %B %d, %Y %H:%M:%S" # Вывод: Wednesday, July 31, 2024 15:26:40
# Манипуляции с датой и временем
date -d "yesterday"
date -d "next week"
# Работа с файлами
date -r filename # Дата последней модификации файла
hwclock - используется для взаимодействия с аппаратными часами и требует повышенных привелегий пользователя.
hwclock --show # Отображает время аппаратных часов
hwclock --systohc # Сохраняет системное время в аппаратные часы
hwclock --hctosys # Устанавливает системное время по аппаратным часам
Для автоматизации управлением временем можно использовать утилиты # NTP, Chrony и systemd-timesyncd, но об этом в другой раз.