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

这可以通过

tzselect


”完成,该操作会在终端“



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


”将设置为gmt“

但是有一种设置方法仅有偏移量的时区,即-1或+5等?

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

如果有人知道如何将系统时钟设置为+/- hour的答案,那就太好了。

评论

请帮助我们选择接受的答案。我认为@Mitch的答案是最好的askubuntu.com/a/323163/22308

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

#1 楼

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

sudo dpkg-reconfigure tzdata


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

评论


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

–user2155009
13年7月23日在11:45

谢谢!!!这会有所帮助,再说一次,我已经手动更改了etc / timezone =),例如php.net/manual/en/timezones.php !!!绝对相同!

– Vladimir Ch
17-2-25在17:05



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

–蛇
17年4月11日在9:55



对我来说@SnakE显示的时间会相应更改

–RiaD
17年11月13日在8:19

我从命令行从腻子更改了它,没有任何问题,为什么您说我的朋友? @ADTC

–saber tabatabaee yazdi
17年4月4日在8:46

#2 楼

您还可以使用新的timedatectl在14.04中设置时间。

sudo timedatectl set-timezone America/New_York


评论


如何在ubuntu上安装它?

–除以零
2015年5月25日4:09

它默认安装在14.04上。

–科林·安德森
2015年6月30日19:24

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

– ADTC
16年1月9日,下午5:57

将sudo timedatectl set-timezone Etc / UTC用于UTC。

–佐尔坦
16年8月22日在14:22

sudo timedatectl list-timezones显示所有可用的时区。

– AlikElzin-kilaka
19年3月24日在16:40

#3 楼

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

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


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

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

希望它可以帮助某人!

评论


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

–user334639
16 Dec 20'在12:56

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

– Darko Miletic
17-09-25在13:33



#4 楼

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

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

–user2155009
13年7月22日在21:18



minitech忘记了力量标志,我猜是-> sudo ln -sf ....

–电话
13-10-28在17:11



这可以解决问题,但不会更新/ etc / timezone中的tz名称。

–池
16年7月17日在14:51

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

– Pierre Gramme
19年3月12日在10:52

#5 楼

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

要更改时区,请删除/etc/localtime并将符号链接分配给所需的城市。例如,ls -l /etc/localtime报告该文件指向/usr/share/zoneinfo/America/Denver。要将其更改为纽约,我要做的是


sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/America/New_York /etc/localtime
请稍等一下,让我的时钟更新

屏幕截图下面显示了来自timedatectl的步骤和确认



评论


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

–帕特里克·科尼利森(Patrick Cornelissen)
17年1月15日在9:20

@PatrickCornelissen首先,已经有tzdata的答案,因此暗示同一件事毫无意义。其次,tzdata的功能几乎相同。取决于用户决定他们喜欢什么,所以它的好坏都不是-只是一个人的喜好。

– Sergiy Kolodyazhnyy
17年1月15日在9:39

好吧,“反对”分发工具通常会导致问题,因此,我会尽可能避免使用您的方法,但可以肯定地说,您的解决方案可以工作(当前)

–帕特里克·科尼利森(Patrick Cornelissen)
17年1月17日在8:42

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

– andho
17年5月8日在7:30

@andho因为/var/lib/dpkg/info/tzdata.list建议/ usr / share / zoneinfo中的所有项目都与该软件包一起提供,所以我假设您确实需要安装该软件包才能拥有所有项目,但是坦白说,我不太确定,再加上对其他发行版的工作方式不太熟悉。考虑在Unix&Linux上问这个问题,如果您想提供该问题的上下文,请随时参考这篇文章。

– Sergiy Kolodyazhnyy
17年5月8日在7:52

#6 楼

更新时区的简单方法是使用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的时区数据,这很不好(并且烦人的故障排除方法,根据我的经验可以说)

–食物
18年7月18日在7:33

#7 楼

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

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

cat /etc/timezone  




sudo hwclock --show  


然后我做:

timedatectl set-timezone <_designation_>


其中<_designation_>是以下之一:

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

EG:

timedatectl set-timezone US/Eastern  



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

评论


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

–马丁·托马
18年11月14日在9:15

#8 楼

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

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

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