Установить TZ в соответствии с / etc / localtime

Символьная ссылка /etc/localtime выглядит так:

 ===> ls -l /etc/localtime ... /etc/localtime -> /usr/share/zoneinfo/Europe/Berlin 

Мне нужна эта информация в переменной окружения TZ .

Это работает:

 ===> TZ=US/Pacific last reboot| head reboot system boot 4.4.0-34-generic Thu Aug 25 02:12 still running reboot system boot 4.4.0-34-generic Wed Aug 24 02:14 still running 

Но это не так:

 ===> TZ=Europe/Berlin last reboot| head reboot system boot 4.4.0-34-generic Thu Aug 25 11:12 still running reboot system boot 4.4.0-34-generic Wed Aug 24 11:14 still running 

Но это происходит (из Википедии Timezones )

 ===> TZ=DE last reboot| head reboot system boot 4.4.0-34-generic Thu Aug 25 09:12 still running reboot system boot 4.4.0-34-generic Wed Aug 24 09:14 still running 

Я ищу способ установить TZ по ссылке /etc/localtime .

Это должно быть автоматизировано и работать во всех часовых поясах.

last –version: util-linux 2.27.1

 ===> cat /etc/adjtime 0.0 0 0.0 0 LOCAL 

Обновить

Записи во внутренней БД выглядят неправильно:

 root pts/20 127.0.0.1 Thu Aug 25 13:29 - 13:29 (00:00) modwork_ pts/17 127.0.0.1 Thu Aug 25 10:38 - 11:37 (00:59) modwork_ pts/18 127.0.0.1 Thu Aug 25 10:05 - 10:19 (00:13) tguettle tty7 :0 Thu Aug 25 09:12 gone - no logout reboot system boot 4.4.0-34-generic Thu Aug 25 11:12 still running 

Ваши аппаратные часы работают в локальном режиме, а не в формате UTC, поэтому метки времени загрузки хранятся некорректно. (Это обозначается LOCAL записью в /etc/adjtime .) last не настраивается для этого, поэтому время загрузки, которое отображается на дисплее, сдвинуто на разницу между вашим /etc/adjtime и UTC (два часа в настоящее время для Берлина). Я не думаю, что есть способ исправить это, не дожидаясь перехода на UTC для ваших аппаратных часов!

Остальная часть этого ответа не относится к вашей фактической проблеме, но по-прежнему актуальна при рассмотрении TZ и /etc/localtime .

Вообще говоря, чтобы использовать значение на основе файлов в TZ , вы должны префикс имени файла : (подробнее см. tzset(3) ):

 TZ=:Europe/Berlin last reboot|head 

Это будет работать с любым именем файла, которое можно использовать в качестве ссылки из /etc/localtime . При необходимости TZDIR может использоваться для переопределения местоположения по умолчанию ( /usr/share/zoneinfo ).

(Предполагается, что вы используете Linux с glibc зависит от реализации, как определено POSIX . В Linux вы обычно можете обойтись без : поскольку обе формы TZ предпринимаются.)

США / Тихий океан Thu Aug 25 02:12 is Европа / Берлин Четверг 25 11:12 , время Берлин – 9 часов больше, чем в США.

 $ TZ=US/Pacific date -d 'Thu Aug 25 02:12' +%s 1472116320 $ TZ=Europe/Berlin date -d 'Thu Aug 25 11:12' +%s 1472116320 

См. Смещения UTC:

 $ TZ=Europe/Berlin date +%z +0200 $ TZ=US/Pacific date +%z -0700 

Итак, ваш второй пример работает . Это третий, который не работает .

TZ=DE является недействительным как стандартное (определение XXX[offset][YYY[dstoffset]] ), поскольку оно имеет только 2 буквы, и, вероятно, нет файла с именем DE в / usr / share / zoneinfo, поэтому по умолчанию используется время UTC ,

 $ TZ=DE date +%z +0000 

Если вы загрузили свою систему в 9:12 по времени в Берлине, то есть в 1472109120 раз в разы, то это означало бы, что часы были отключены на два часа в то время, когда запись была добавлена ​​в wtmp .

Это одна из первых вещей, выполняемых init при запуске системы. Обычно это происходит до того, как будут запущены службы синхронизации времени сети (которые будут исправлять эти часы). Ваши другие правильные записи wtmp показывают, что часы были зафиксированы к моменту входа первого человека.

Если ваша система является мультизагрузкой, а одна из других систем сделана Microsoft, обратите внимание, что в системах Microsoft есть ошибка / ошибка, поскольку они устанавливают аппаратные часы по местному времени, а не по умолчанию по умолчанию. Таким образом, если ваша Unix-подобная ОС ожидает, что аппаратные часы будут в UTC, возникнет конфликт, когда вы загружаетесь в ОС Microsoft, ОС будет пытаться переключать аппаратные часы с UTC на локальное время, а ваша ОС Unix будет делать обратное.

В соответствии с этим , по-видимому, уже невозможно исправлять операционные системы Microsoft, поэтому вам нужно будет обойти это, сообщив вашей операционной системе Unix о том, что аппаратные часы установлены на локальное время, например, в Windows (и убедитесь, что все ОС согласны с тем, что местное время означает) (и убедитесь, что вы не закрываете или не перезагружаетесь во время / через изменение DST). Например, в существующих системах Debian это делается путем изменения UTC на LOCAL в /etc/adjtime .

Теперь, поскольку ваше adjtime уже содержит LOCAL , это исключает эту гипотезу. Другие возможности: у вас есть еще одна система, которая устанавливает часы в UTC, или это система Microsoft, где локальное время установлено на UTC. Изменение LOCAL на UTC , вероятно, устранит проблему.

Или, как правило, вы хотите, чтобы все операционные системы в системе согласовывали настройки аппаратных часов.