Как я уже говорил, тема времени — очень скользкая. Здесь нас поджидают сотни договорённостей, которые были приняты до нас. Однако, нам с этим жить. И, возможно, жить с этим под Linux и прочими Unix.
Установить и узнать время в Linux/Unix
Для начала установим дату:
$ sudo date +%Y%m%d -s "20170605"
И время:
$ sudo date +%T -s "22:38:00"
Но вот ведь не задача: мы же не указали, в какой временной зоне наше время… Linux выберет ту, которая установлена в системе (об этом ниже). Но если временная зона неизвестна — что делать?
Мы можем воспользоваться менее человеко-читаемым вариантом ввода времени. Однако, он удобнее в плане того, что не зависит от временных зон — Unix Time!
Unix Time — это ещё одна договорённость. Это просто количество секунд, которые прошли с 1-го января 1970-го года по Гринвичу. Вне зависимости от вашего часового пояса, количество секунд с того момента прошло одинаково.
$ sudo date +%s -s @1496679078
Посмотреть время можно с помощью той же утилиты date
:
$ date Пн июн 5 22:38:37 +05 2017
Или в unixtime:
$ date +%s 1496679078
Часы BIOS (аппаратные часы)
Да, если вам кажется, что мы настроили время, то вы заблуждаетесь. Да, мы установили время в системе… до первой перезагрузки! На самом деле, на время также хранится в маленьком чипе на материнской плате. Этот чип имеет свою батарейку, чтобы не зависеть от электросети, которая иногда пропадает. Время на нём также нужно устанавливать, ведь именно его использует операционная система при загрузке.
Итак, давайте посмотрим, который час «по-аппаратному»:
$ sudo hwclock --show [sudo] пароль для gosha: Пн 05 июн 2017 22:37:58 .748508 seconds
и, если нас не устраивает, установим своё время:
$ sudo hwclock --set --date="2017-06-05 22:38:00" --localtime
Также можно ставить время в utc (вместо localtime) для любителей.
Теперь и после перезагрузки время будет идти «правильно».
Временные зоны
Ах, подождите! Но ведь мы установили время опять же в «человеческом» формате! А вдруг, у нас был не тот часовой пояс!? Давайте уже решим эту проблему и настроим временную зону в системе!
Установить временную зону можно опять же из консоли. Для этого сходим в папку /usr/share/zoneinfo/
и смотрим, что там есть. К примеру, я знаю, что моя временная зона — Екатеринбург, а он находится в Азии.
$ ls /usr/share/zoneinfo/ Africa Egypt Hongkong Mexico ROC America Eire HST MST ROK Antarctica EST Iceland MST7MDT Singapore Arctic EST5EDT Indian Navajo SystemV Asia Etc Iran NZ Turkey Atlantic Europe iso3166.tab NZ-CHAT UCT Australia Factory Israel Pacific Universal Brazil GB Jamaica Poland US Canada GB-Eire Japan Portugal UTC CET GMT Kwajalein posix WET Chile GMT0 leap-seconds.list posixrules W-SU CST6CDT GMT-0 Libya PRC zone1970.tab Cuba GMT+0 localtime PST8PDT zone.tab EET Greenwich MET right Zulu
К слову, внутри бинарная информация, но заглянуть внутрь мы всё же можем с помощью утилиты file
:
$ file /usr/share/zoneinfo/Asia/Yekaterinburg /usr/share/zoneinfo/Asia/Yekaterinburg: timezone data, version 2, 12 gmt time flags, 12 std time flags, no leap seconds, 67 transition times, 12 abbreviation chars
Собственно, меня всё устраивает — устанавливаем временную зону:
$ sudo cp /usr/share/zoneinfo/Asia/Yekaterinburg /etc/localtime
Установив временную зону, мы можем уже настроить автоматическое обновление настроек времени с помощью протокола NTP — Network Time Protocol — протокол сетевого времени.
Обновить время можно, например командой ntpdate. Не всегда она есть в системе, поэтому ставим (вариант для Ubuntu/Debian/Linux Mint):
sudo apt install ntpdate
после установки уже можно сделать:
$ sudo ntpdate 0.ru.pool.ntp.org 5 Jun 22:54:33 ntpdate[31964]: adjust time server 195.208.218.66 offset 0.005950 sec
где 0.ru.pool.ntp.org
— один из русских серверов ntp.
ntpdate сходила на удалённый сервер по протоколу ntp и установила полученное с сервера время нам в систему.
Также можно указать сервера в файле /etc/ntp.conf
, чтобы ntpd автоматически обновлял время из сети:
server 0.ru.pool.ntp.org iburst server 1.ru.pool.ntp.org iburst server 2.ru.pool.ntp.org iburst server 3.ru.pool.ntp.org iburst
Однако, чтобы использовать именно ntpd для настройки времени, его надо будет поставить(вариант для Ubuntu/Debian/Linux Mint):
sudo apt install ntp
— вполне возможно, что у вас используется какой-то другой демон.
Вот такой базовый набор команд у нас имеется под рукой, если мы решили таки взять и сделать правильно! К сожалению или счастью, это далеко не все сложности, которые встречаются при работе со временем. О более интересных проблемах будет другая заметка.
Цените время!