Задача: выставить точное локальное время на компьютере.
Для себя я уяснил, что есть два основных подхода к отслеживанию времени на локальном компьютере. Один из них, пользовательский, так сказать, использует Windows, приравнивая показатели аппаратных часов BIOS к местному времени; пользователю нет необходимости забивать себе голову разницей между часовыми поясами и отношением показателей аппаратного таймера BIOS к местному времени. Другой подход, более строгий и логичный, на мой взгляд, используют системы на основе Unix; в часах BIOS сохраняется время, приравненное к UTC, грубо говоря, к Гринвичскому, а местное время выводится путём добавления к аппаратному данных о текущем часовом поясе (GMT).
Тонкостей с выставлением локального системного времени в Windows никаких нет, так что далее речь пойдет исключительно о потомках Unix.
Проводим предварительную разведку:
# date
Видим что то вроде этого:
Sat Oct 24 18:39:13 Zimbabwe 2009
Обнаруживаем, что компьютер живет в отличном от нашего временном поясе (GMT), что чревато не согласованиями в процессе работы приложений.
Идём в файловую систему и ищем описания временных зон для данной реализации системы. Возможно находим их в районе "/usr/share/zoneinfo". Приводим значение GMT к вменяемому виду:
Ищем в директории "zoneinfo" каталог, имя которого соответствует нашей временной зоне (например Asia).
Ищем в директории, соответствующей нашей временной зоне, файл, имя которого соответствует месту, которое находится в нашей временной зоне (например Almaty).
Приводим конфигурационный файл "/etc/timezone" к следующему виду:
Asia/Almaty
Ищем в директории "zoneinfo" каталог, имя которого соответствует нашей временной зоне (например Asia).
Ищем в директории, соответствующей нашей временной зоне, файл, имя которого соответствует месту, которое находится в нашей временной зоне (например Almaty).
Удаляем файл "/etc/localtime" и создаем ссылку на тот файл, что описывает нашу временную зону:
# rm /etc/localtime
# ln -sf /usr/share/zoneinfo/Asia/Almaty /etc/localtime
# ln -sf /usr/share/zoneinfo/Asia/Almaty /etc/localtime
Имеет смысл проверить на наличие и содержимое ещё один конфигурационный файл "/etc/sysconfig/clock" (в каких то дистрибутивах он есть, в каких-то нет). В нем указание системе на то, что она должна выставлять смещения к показателям аппаратных часов BIOS, интерпретируемых как UTC, в соответствии с приведённым часовым поясом для системного локального времени.
ZONE="Asia/Almaty"
UTC=true
ARC=false
UTC=true
ARC=false
Простейший способ установить системную дату с помощью встроенных средств — отдать следующую комманду (где mm – месяц, dd – день, HH -час в 24 часовой схеме, MM — минуты, yy – последние две цифры текущего года):
# date mmddHHMMyy
После того, как мы навели порядок с отображением локального времени и откорректировали его показания, неплохо было бы сохранить эти данные в аппаратных часах BIOS. Большинство современных дистрибутивов Linux и Unix имеют соответствующую скриптовую составляющую, что сделает эту работу за нас при штатной остановке работы системы; но мало ли что может произойти? Можно сделать эту работу вручную.
Команда "hwclock" позволяет нам получить состояние аппаратных часов и увидеть, после сравнения с выводом команды date, насколько локальное системное и аппаратное время различается.
Следующая команда установит время аппаратных часов равным UTC (Гринвичскому) на основании текущего локального системного времени:
# hwclock --systohc --utc
22 июня 2012 в 10:25