Вопрос или проблема
Недавно я обновился до 24.04.1 LTS, и теперь команда date
всегда выводит время в UTC, вместо того чтобы использовать местное время для часового пояса CDT.
$ timedatectl
Местное время: Вс 2024-09-29 14:14:24 CDT
Универсальное время: Вс 2024-09-29 19:14:24 UTC
Время RTC: Вс 2024-09-29 19:14:24
Часовой пояс: America/Chicago (CDT, -0500)
Системные часы синхронизированы: да
Служба NTP: активна
RTC в местном часовом поясе: нет
Несмотря на то, что местный часовой пояс установлен правильно, команда date
отображает время в UTC, а не в CDT:
$ date
Вс Сен 29 19:15:00 2024
Временная метка, отображаемая при использовании ls -l
, также показывает время в UTC.
$ touch x
$ ls -l x
-rw-rw-r-- 1 tmacd tmacd 0 Сен 29 19:22 x
$ ls -l /etc/localtime
lrwxrwxrwx 1 root root 35 Сен 23 19:39 /etc/localtime -> /usr/share/zoneinfo/America/Chicago
Есть идеи, как заставить команду date
отображать время с использованием местного часового пояса?
TZ
, содержащая нераспознанный идентификатор часового пояса, может привести к тому, что команда date
вернется к отображению времени в UTC.
% timedatectl
Местное время: Пн 2024-09-30 05:11:37 CEST
Универсальное время: Пн 2024-09-30 03:11:37 UTC
Время RTC: Пн 2024-09-30 03:11:37
Часовой пояс: Europe/Rome (CEST, +0200)
Системные часы синхронизированы: да
Служба NTP: активна
RTC в местном часовом поясе: нет
% date
Пн Сен 30 05:11:42 CEST 2024
% TZ=foo date
Пн Сен 30 03:11:49 foo 2024
В вашем случае TZ
был установлен в US/Central
, что является правильным псевдонимом для America/Chicago
; я не совсем понимаю, в чем дело с US/Central
и другими псевдонимами, вызывающими такое поведение, но, похоже, что-то не так.
Сравните вывод TZ=foo date
и TZ=US/Central date
. Первый заставит команду date
указать, что время выводится в часовом поясе foo
, в то время как последний заставит указать, что время выводится в… “” (пустая строка) часовом поясе:
% TZ=foo date
Пн Сен 30 03:26:00 foo 2024
% TZ=US/Central date
Пн Сен 30 03:26:02 2024
Я не уверен, является ли это какой-то ошибкой (пустая строка это явно предполагает) или это поведение как-то имеет смысл, однако решение заключается в том, чтобы проследить, где устанавливается TZ
(в вашем случае это было установлено в ~/.bashrc
) и либо удалить определение TZ
полностью, либо установить его в America/Chicago
.
На моем компьютере с Ubuntu TZ
по умолчанию не задан, так что я думаю, что удаление определения TZ
будет уместным.
Ответ или решение
После установки Ubuntu 24.04.1 LTS на ваш настольный компьютер вы столкнулись с проблемой, что команда date
выводит время в формате UTC, вместо ожидаемого местного времени в зоне CDT (Центральное время США). Из предоставленной информации видно, что система правильно настроена на использование зоны America/Chicago, поскольку вывод команды timedatectl
показывает правильное местное время. Однако, команда date
и вывод ls -l
отображают временные метки в формате UTC.
Причины проблемы:
- Переменная окружения TZ: Возможно, проблема связана с переменной окружения
TZ
, которая может быть установлена некорректно или с использованием нераспознанного идентификатора часового пояса. Например, еслиTZ
установлен вUS/Central
, это может привести к тому, что командаdate
будет вести себя неожиданно, возвращая пустую строку вместо корректного значения.
Решение:
-
Проверка переменной TZ: Для начала проверьте, установлена ли переменная
TZ
. Введите в терминале:echo $TZ
-
Корректировка переменной TZ:
-
Если переменная
TZ
определена и равнаUS/Central
, это может вызывать проблему. Необходимо либо удалить эту переменную, либо установить её в корректное значение. -
Если вы хотите удалить переменную, сделайте это, открыв файл
~/.bashrc
(или~/.bash_profile
, если вы используете его) в текстовом редакторе и найдите строку, где определяетсяTZ
, затем закомментируйте её, добавив#
в начале строки, или удалите её. Например:# export TZ=US/Central
-
Чтобы установить корректное значение, добавьте следующую строку в файл
~/.bashrc
:export TZ=America/Chicago
-
-
Применение изменений:
После внесения изменений в файл, вам нужно перезагрузить настройки окружения. Это можно сделать либо закрыв и открыв терминал, либо выполнив:source ~/.bashrc
-
Проверка изменений:
После изменения или удаления переменнойTZ
, снова выполните командуdate
:date
В выводе теперь должно отображаться местное время в формате CDT.
-
Дополнительная проверка: Убедитесь, что системный часовой механизм является активным и правильно настроен, выполнив команду
timedatectl
:timedatectl
Убедитесь, что "RTC in local TZ" установлено в "no"; это нормально для большинства систем, работающих с UTC.
Если после выполнения всех этих шагов проблема не решена, стоит рассмотреть возможность обновления пакетов системы или выполнения диагностики часового пояса, чтобы гарантировать, что все служебные файлы и ссылки настроены правильно.