Настройка часового пояса в Linux [закрыто]

157

Я устанавливаю часовой пояс GMT + 6 на моем компьютере с Linux, скопировав файл zoneinfo /etc/localtime, но dateкоманда все еще показывает время как UTCtime-6. Может ли кто-нибудь объяснить мне это поведение?

Я предполагаю, что dateкоманда должна отображать UTCtime+6время. Вот шаги, за которыми я следую:

date
Wed Jan 22 17:29:01 IST 2014

date -u
Wed Jan 22 11:59:01 UTC 2014

cp /usr/share/zoneinfo/Etc/GMT+6 /etc/localtime

date
Wed Jan 22 05:59:21 GMT+6 2014

date -u
Wed Jan 22 11:59:01 UTC 2014
Рахул Дхоби
источник
Была ли установлена ​​переменная окружения TZ ( echo $TZвыдает что-то, кроме пустой строки)? Также может быть лучше создать символическую ссылку /etc/localtimeвместо того, чтобы копировать фактический файл (таким образом, вы будете в безопасности, если данные zoneinfo изменятся, что, скорее всего, никогда не изменится).
Сами Лэйн
Что за дистрибутив? Разные дистрибутивы справляются с этим по-разному!
SLM
@slm: я использую Ubuntu 12.04
Рахул Дхоби
Скорее всего, вы не знали эту политику, но не предполагаете, что вы будете размещать одни и те же вопросы на разных сайтах SE. stackoverflow.com/questions/21282367/timezone-setting-in-linux
slm
2
«Этот вопрос был размещен на нескольких сайтах» Ха, это новый для меня. Никогда не встречал сайт SE с такой серьезной причиной. Во всяком случае, это первый вопрос, который возникает в Google при поиске того, как изменить часовой пояс в Linux, и это самый высоко оцененный вопрос из всех, которые я видел, так что, может быть, его следует открыть снова?
Ajedi32

Ответы:

273

Посмотрите на это сообщение в блоге под названием: Как: 2 метода для изменения TimeZone в Linux .

Red Hat дистрибутивы

Если вы используете дистрибутив, такой как Red Hat, тогда ваш подход к копированию файла будет в основном приемлемым.

ПРИМЕЧАНИЕ. Если вы ищете решение, не зависящее от дистрибутивов, оно также работает в Debian, хотя ниже представлены более простые подходы, если вам нужно иметь дело только с машинами Debian.

$ ls /usr/share/zoneinfo/
Africa/      CET          Etc/         Hongkong     Kwajalein    Pacific/     ROK          zone.tab
America/     Chile/       Europe/      HST          Libya        Poland       Singapore    Zulu
Antarctica/  CST6CDT      GB           Iceland      MET          Portugal     Turkey       
Arctic/      Cuba         GB-Eire      Indian/      Mexico/      posix/       UCT          
Asia/        EET          GMT          Iran         MST          posixrules   Universal    
Atlantic/    Egypt        GMT0         iso3166.tab  MST7MDT      PRC          US/          
Australia/   Eire         GMT-0        Israel       Navajo       PST8PDT      UTC          
Brazil/      EST          GMT+0        Jamaica      NZ           right/       WET          
Canada/      EST5EDT      Greenwich    Japan        NZ-CHAT      ROC          W-SU         

Я бы порекомендовал ссылаться на него, а не копировать.

$ sudo unlink /etc/localtime 
$ sudo ln -s /usr/share/zoneinfo/Etc/GMT+6 /etc/localtime

Теперь дата показывает другой часовой пояс:

$ date -u
Thu Jan 23 05:40:31 UTC 2014

$ date 
Wed Jan 22 23:40:38 GMT+6 2014

Ubuntu / Debian Distros

Чтобы изменить часовой пояс в любом из этих дистрибутивов, вы можете использовать эту команду:

$ sudo dpkg-reconfigure tzdata

    сс # 1

$ sudo dpkg-reconfigure tzdata

Current default time zone: 'Etc/GMT-6'
Local time is now:      Thu Jan 23 11:52:16 GMT-6 2014.
Universal Time is now:  Thu Jan 23 05:52:16 UTC 2014.

Теперь, когда мы проверим это:

$ date -u
Thu Jan 23 05:53:32 UTC 2014

$ date 
Thu Jan 23 11:53:33 GMT-6 2014

ПРИМЕЧАНИЕ. В Ubuntu 14.04 и более поздних версиях также есть эта опция с помощью одной команды (источник: Ask Ubuntu - установка часового пояса с терминала ):

$ sudo timedatectl set-timezone Etc/GMT-6

Об использовании "Etc / GMT + 6"

выдержка из ответа @ MattJohnson на SO

Такие зоны Etc/GMT+6намеренно меняются местами для обратной совместимости со стандартами POSIX. Смотрите комментарии в этом файле .

Вы почти никогда не должны использовать эти зоны. Вместо этого вы должны использовать в полной мере с именем часового пояса , как America/New_Yorkи Europe/Londonили то , что подходит для вашего местоположения. Обратитесь к списку здесь .

SLM
источник
1
см. ответ на этот вопрос здесь stackoverflow.com/questions/21282367/timezone-setting-in-linux
Рахул Дхоби
@ user3184706 - вы тут напутали. Ваш вопрос здесь был о том, как изменить часовой пояс, на что я ответил. Немного об использовании GMT .. часового пояса или нет, что SO A предоставил, является точным, но я не упомянул об этом здесь, так как вы действительно не спрашивали об этом, хотя я думал. Я могу либо добавить этот бит к этому А, либо вы можете скопировать / вставить эту информацию здесь как свой собственный А.
slm
@ user3184706 - чтобы попытаться убрать это, я включил Мэтта А в свой, чтобы завершить его.
SLM
1
Обратите внимание, что если вы находитесь в контейнере, с Ubuntu вы должны установить пакет, tzdataиначе файлы /usr/share/zoneinfoне будут существовать.
Эллиотт Слотер
1
timedatectlработает для SLES 12 тоже.
Александр Малахов
24

Вот как я это делаю в Ubuntu. Просто замените Asia/Tokyoсвой часовой пояс.

echo 'Asia/Tokyo' | sudo tee /etc/timezone

sudo dpkg-reconfigure -f noninteractive tzdata

Существует ошибка в tzdata: определенные значения нормализуются с помощью dpkg-reconfigure:

echo 'US/Central' >/etc/timezone
dpkg-reconfigure -f noninteractive tzdata
# Current default time zone: 'America/Chicago'

echo 'US/Eastern' >/etc/timezone
apt-get install --reinstall tzdata
# Current default time zone: 'America/New_York'
user241
источник
Это также работает, но в Debian / Ubuntu ответ slm, вероятно, проще и менее рискован (нет шансов на опечатки)
Андреас Хартманн
17

Команда tzselect создана, чтобы делать то, что вы хотите.

SHW
источник
1
И скомпилировать это в одну строку, которая устанавливает TZпеременную для вашего местного часового пояса - например, для America / Los_Angeles - export TZ=`printf "2\n49\n21\n1\n" | tzselect 2>&1 | tail -1` . Вы можете поместить эту строку в ваш .profile , as tzselect`, если вы хотите запустить его по подсказке.
Самерс