从终端设置时区


210

我想从终端更改系统时钟的时区。

这可以用

tzselect

“这将在终端中打开gui”

要么

sudo cp /usr/share/zoneinfo/Europe/London /etc/localtime

“将设置为gmt”

但是有没有办法只用偏移量设置时区,即-1或+5等?

我在编写用于调整时间偏移或报告日志的应用程序时需要执行此操作,而我仅有的信息是用户IP。我可以使用webapp查找IP的位置,但是如果我只能获取位置的偏移量,那么我就需要设置偏移量,这很容易,但是如果我需要查找区域和城市,那将是一个真正的痛苦。 。

如果有人知道如何将系统时钟设置为+/-小时的答案会很好。


请帮助我们选择接受的答案。我认为@Mitch
Nam G VU

1
@NamGVU不,米奇不是最好的解决方案,它是“终端中的GUI”的答案。甚至OP都说:“这将无法正常工作,因为我需要在没有用户输入的情况下从程序中更改时区,我需要一个可以输入到终端而不是gui解决方案的命令”,而这正是寻找“终端解决方案”时大多数人想要的目标,脚本友好的。如果您知道一个城市,最好是科林·安德森(Collin Anderson),或者简单的格林尼治标准时间(GMT + -n)
最好是

在Ubuntu 18.04中,tzselect无法打开gui。它具有基于终端的菜单选择。
蒂姆·理查森

Answers:


321

要从终端更改时区,只需按键盘上的Ctrl+ Alt+ T打开终端即可。打开时,运行以下命令:

sudo dpkg-reconfigure tzdata

打开后,只需跟随屏幕更改时区即可。


14
这将无法正常工作,因为我需要在没有用户输入的情况下从程序中更改时区,我需要一个命令,我可以将其输入到终端而不是gui解决方案,谢谢您的回复
user2155009 2013年

1
谢谢!!!这会有所帮助,再说一次,我已经手动更改了etc / timezone =),例如php.net/manual/en/timezones.php!!!完全相同!
弗拉基米尔Ch

重新配置tzdata似乎也可以调整硬件时钟,以便在时区切换后显示的时间保持不变。如果您的时间正确但时区错误,则可能需要这样做。但是,您绝对不希望在旅行时触摸硬件时钟。该timedatectl办法似乎只能更改时区。
SnakE

对我来说,@ SnakE显示的时间发生了相应的变化
RiaD '17

我把它从普通线路的腻子改成了毫无疑问的,为什么你说我的朋友呢?@ADTC
saber tabatabaee yazdi

170

您也可以使用新功能timedatectl在14.04中设置时间。

sudo timedatectl set-timezone America/New_York

如何在ubuntu上安装它?
由2015年

1
它默认安装在14.04上。
Collin Anderson

6
要查看所有可用选项,可以运行ls -R --group-directories-first /usr/share/zoneinfo(请注意不要在此处修改或删除任何文件。)有关posixright前缀的更多信息在此处
ADTC

这可行!...
Dan Nissenbaum

3
使用sudo timedatectl set-timezone Etc/UTC的UTC。
佐尔坦

19

您可以在中使用GMT± x文件/usr/share/zoneinfo/Etc

sudo ln -fs /usr/share/zoneinfo/Etc/GMT$offset /etc/localtime

感谢分配给我的回复我收到一个错误信息ln:无法创建符号链接`/ etc / localtime':文件过时了我不确定我对这本教程甚至某些关键词的良好指导我知道吗,我可以用google搜索谢谢我正确使用命令?我使用sudo ln / usr / share / zoneinfo / Etc / GMT $ + 1 / etc / localtime将时钟设置为+ 1gmt
2013年

9
MiniTech移动忘了强制标志我想是- >须藤LN -sf ....
远程

1
可以,但是不会更新中的tz名称/etc/timezone
poolie

1
要更新/ etc / timezone,请运行sudo dpkg-reconfigure --frontend noninteractive tzdata
Pierre Gramme

17

我意识到此线程有些陈旧,但是我一直在寻找更好的解决方案,因为在用户从我们的网站下载并部署虚拟机后,我需要在VM中自动设置时区。我最终得到的是:

echo "Setting TimeZone..."
export tz=`wget -qO - http://geoip.ubuntu.com/lookup | sed -n -e 's/.*<TimeZone>\(.*\)<\/TimeZone>.*/\1/p'` &&  timedatectl set-timezone $tz
export tz=`timedatectl status| grep Timezone | awk '{print $2}'`
echo "TimeZone set to $tz"

一旦它在新网络上启动,它将从服务器查询geoip.ubuntu.com(我的脚本首先检查连接性),然后根据响应设置服务器的时区。

“ wget -q0-”告诉wget仅将结果输出到stdout,然后将其通过管道传输到$ tz变量。

希望它能对某人有所帮助!


1
大!在Ubuntu 16.04上,它应该是“ grep zone”和“ print $ 3”。
user334639 '16

我为获取时区提出了不同的建议。在我看来,它更干净:curl -s'geoip.ubuntu.com/lookup '| xmllint --xpath'/ Response / TimeZone / text()'
Darko Miletic

11

TL; DR /etc/localtime是指向/usr/share/zoneinfo/Continent/City。中文件的符号链接。通过更改指向的位置,您可以更改时区。

为了更改时区,请删除/etc/localtime并为您想要的城市分配符号链接。例如,ls -l /etc/localtime报告此文件指向/usr/share/zoneinfo/America/Denver。要将其更改为纽约,我愿意

  1. sudo rm /etc/localtime
  2. sudo ln -s /usr/share/zoneinfo/America/New_York /etc/localtime
  3. 等一下我的时钟更新

下面的屏幕快照显示了步骤和确认 timedatectl

在此处输入图片说明


很高兴了解幕后发生的事情,但是您认为建议使用诸如dpkg-reconfigure tzdata等之类的指定工具会更好吗?
Patrick Cornelissen

@PatrickCornelissen首先,tzdata已经有了答案,所以暗示同一件事是没有意义的。第二,tzdata做的差不多。取决于用户决定他们喜欢什么,所以它的好坏都不是-只是一个人的喜好。
Sergiy Kolodyazhnyy

1
好吧,“反对”分发工具通常会导致问题,因此,我会尽可能避免使用您的方法,但公平的说,您的解决方案将起作用(当前)
Patrick Cornelissen

据我了解,该解决方案可在不同的发行版中使用。但是仍然需要/ usr / share / zoneinfo目录中可用的时区数据库。有没有一种方法可以在不安装tzdata软件包的情况下获取时区数据库?
安德霍(Andho)'17年

@andho既然/var/lib/dpkg/info/tzdata.list建议该/usr/share/zoneinfo软件包中包含所有项目,所以我认为您确实需要安装该软件包才能拥有所有项目,但是坦率地说,我不太确定,另外还不太熟悉此软件包在其他项目上的工作方式分布。考虑在Unix&Linux上问这个问题,如果您想提供该问题的上下文,请随时参考此帖子。
谢尔盖·科洛迪亚兹尼

10

更新时区的简单方法是使用sudo dpkg-reconfigure tzdata。但这不是那么容易编写的脚本。

如果要通过脚本(例如用于设置VM)显式设置时区,请参考以下方法:

为您想要的时区设置一个变量,例如

tz=Europe/London
tz=America/Anchorage
tz=Etc/GMT+6

有效值为目录下的目录和文件名/usr/share/zoneinfo

然后简单地

sudo cp -vf /usr/share/zoneinfo/$tz /etc/localtime
echo $tz | sudo tee /etc/timezone

请注意,两者/etc/localtime/etc/timezone必须一致。

现在可能重新启动以也更新所有服务(例如cron)。


-1:永远不要cp用于设置/ etc / localtime。/ etc / localtime是指向正确文件的符号链接。如果使用cp它进行更改,则实际上将掩盖当前指向的任何tzdata文件的内容,因此,例如,UTC tzdata文件突然包含欧洲/伦敦的时区数据,而不是UTC的时区数据,这很不好(而且很烦人)从我的亲身经历可以说来解决问题)
Foogod

5

这是我使用的方法,该方法以美国为中心,因为我不必担心非美国时区。

如果需要确定当前时区,则可以执行以下操作:

cat /etc/timezone  

要么

sudo hwclock --show  

然后,我做:

timedatectl set-timezone <_designation_>

其中<_designation_>是下列中的一种:

美国/东部
美国/中部
美国/山地
美国/太平洋
美国/阿拉斯加
美国/阿留申美国
/亚利桑那州
美国/东印第安纳州
美国/夏威夷
美国/印第安纳州斯塔克
美国/密歇根州
美国/太平洋新州
/萨摩亚

例如:

timedatectl set-timezone US/Eastern  

其他时区名称可以在这里找到:https : //en.wikipedia.org/wiki/List_of_tz_database_time_zones


tzselect是获取时区字符串的好方法
Martin Thoma,

0

除非您选择要与每个时区偏移量相对应的时区文件,否则您无法执行此操作。

一些答案建议使用/ usr / share / zoneinfo / Etc中的文件,但这些文件的问题在于它们与DST无关。

因此,除非您选择一些时区配置来匹配每个偏移量,否则您将不在乎DST,否则无法进行一般性的处理。

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.