Linux中的时区设置


157

我通过将zoneinfo文件复制到Linux机器上,将时区设置为GMT + 6 /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
Rahul Dhobi,2014年

您可能不知道此政策,但是您不希望在不同的SE网站上交叉发布相同的Q。stackoverflow.com/questions/21282367/timezone-setting-in-linux
slm

2
“这个问题已经发布在多个站点上了”呵呵,对我来说这是一个新问题。从来没有遇到过类似的SE网站。无论如何,这是Google搜索如何更改Linux时区时出现的第一个问题,它是我所见过的最受好评的问题,因此也许应该重新打开它?
Ajedi32 '16

Answers:


272

看一下这篇标题为:如何:在Linux中更改TimeZone的2种方法的博客文章。

红帽发行

如果您使用的是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发行版

要更改这两个发行版中的时区,可以使用以下命令:

$ sudo dpkg-reconfigure tzdata

    SS#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- 从terminal设置时区):

$ sudo timedatectl set-timezone Etc/GMT-6

关于“ Etc / GMT + 6”的使用

摘自@MattJohnson关于SO的答案

Etc/GMT+6为了与POSIX标准向后兼容,故意将类似的区域反转。请参阅此文件中的注释。

您几乎永远不需要使用这些区域。相反,您应该使用全名时区,例如America/New_YorkEurope/London或适合您所在位置的任何时区。请参阅此处的列表。



@ user3184706-您在这里有些混乱。您在这里的问题是如何更改时区,我回答了。SO A所提供的有关使用GMT ..时区与否的信息是准确的,但是我忽略了将其包括在这里,因为尽管我没有真正问过这个问题。我既可以是位添加到该A或者你可以在这里复制/粘贴这些信息作为自己的A.
SLM

@ user3184706-尝试解决此问题,我将Matt's A包括在内以使其完整。
slm

1
但是请注意,如果您在容器中,则必须使用Ubuntu安装软件包tzdata,否则其中的文件/usr/share/zoneinfo将不存在。
Elliott Slaughter

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'

这也可行,但是在Debian / Ubuntu中,slm的答案可能更容易且风险更低(没有错别字的机会)
Andreas Hartmann

17

做出tzselect命令来执行您想要的操作。


1
并将其压缩为一行,将TZ变量设置为您当地的时区-例如,America / Los_Angeles- export TZ=`printf "2\n49\n21\n1\n" | tzselect 2>&1 | tail -1` 。您可以将该行放入.profile , as tzselect`中,如果您在提示符下运行该行,则很有帮助。
sameers 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.