根据位置自动设置Linux时区


19

我们如何使用Internet在Linux中自动设置系统默认时区?如我所见,NTP服务器只能更新时间,而不能更新时区。是否有任何服务器可以更改时区?


1
您是说时区从夏令时更改为标准时间吗?
slm

在这里,有两件事。1.国家是否有变化。2.如果日光节约时间发生变化,则为秒。
嵌入式程序员

ntp服务器会自动处理夏令时的更改。我不知道有任何服务器可以检测到您的位置并自动更新您的时区(就像手机一样)。
drs 2013年

2
@drs更准确地说,NTP根本不关心时区。NTP时间是UTC,简单明了,时区转换由客户端执行。特定的NTP客户端可以执行时区转换,也可以不执行时区转换,但是由于大多数* nix系统无论如何都将系统时钟设置为UTC,因此不需要这样做。
CVn 2013年

Answers:


36

不久前,我编写了一个程序来执行此操作:tzupdate

您可以通过运行tzupdate -p以下命令查看将其设置为时区(不进行实际设置)的内容:

$ tzupdate -p
Europe/Malta

您可以通过tzupdate以root身份运行将其设置为真实。

$ sudo tzupdate
Europe/Malta
$ date
Thu 12 Sep 05:52:22 CEST 2013

这是通过以下方式工作的:

  • 地理定位您当前的IP
  • 获取该位置的时区
  • 将符号链接更新/etc/localtime为指向该时区的zoneinfo文件

6

这是一个旧线程,但仍然与不会自动更改时区的kubuntu 1710有关。我正在使用Chris Down的tzupdate解决方案,但还要确保在系统尝试连接到网络(WiFi或其他网络)时触发该解决方案。这假定您正在使用网络管理器。

首先打开一个终端。

  1. 安装tzupdate

    sudo apt install python-pip
    pip install -U tzupdate
    

    然后确保所有用户都可以访问它

    sudo cp -R ~/.local/lib/python2.7/site-packages/. /usr/lib/python2.7/.
    sudo cp /home/marta_riba/.local/bin/tzupdate /usr/local/bin/tzupdate
    
  2. 测试它是否有效

    sudo tzupdate
    
  3. 然后,我们需要做的是确保所有用户都可以访问

    sudo su -
    tzupdate
    

    这将使您成为root用户,然后检查命令是否更改了您的时区。然后确保您退出以普通用户身份返回

    exit
    
  4. 确保tzupdate可以在没有密码的情况下使用sudo运行。当我们从在后台运行它的networkmanager触发它时,这是后续步骤所需的。在终端中键入此内容以编辑sudoers文件

    sudo visudo
    

    在文件末尾添加此行

    ALL ALL=(root) NOPASSWD: /usr/local/bin/tzupdate
    

    按CTRL-X,然后按Y,然后按Enter以保存更改

  5. 然后,我们确保NetworkManager总是在触发网络连接更改后(例如,在连接wifi时)调用此函数。为此,我们在dispatcher.d文件夹中创建一个名为tzupdate的文件,该文件仅调用sudo tzupdate。该文件需要可执行权限才能运行

    echo 'sudo tzupdate'| sudo tee /etc/NetworkManager/dispatcher.d/99-tzupdate
    sudo chmod +x /etc/NetworkManager/dispatcher.d/99-tzupdate
    

    请注意,NetworkManager将调用execute sudo(即sudo tzupdate),通常会提示输入密码。

    可能有更好的方法来执行此操作,即让NetworkManager仅在建立连接而不是断开连接时才调用此方法(如上所述)-我尝试将脚本放在/ etc / network / if-up中.d但这对我没有用

  6. 要在Kubuntu中进行测试-将您的本地时区更改为其他时区(转到任务栏中的Date plasmoid,然后右键单击并从标签中选择“ Adjust Date / Time”,然后选择“ TimeZone”)

    关闭您的wifi,然后重新打开-您会看到它一旦连接到wifi,似乎要等待30秒钟左右,然后才能成功更改您的时区。

    请注意,这尚未在需要在网页上输入密码的wifi中进行测试。希望它在网络连接的最后运行,这一事实应该为用户提供足够的时间来输入凭据-否则,这可能需要进一步调整(检查是否存在连接,检查是否能够连接到互联网,等待X秒钟(如果无法连接到互联网),然后重试Y次


2
太糟糕了,2018年仍然是正确的答案。我相信Gnome有一个可以解决这个问题的软件包(gnome-clocks),但是在KDE中目前没有其他好的解决方案。
主讲人

您可以在运行命令之前执行“ if [“ $ 2” =“ up”]“,以检查网络连接是否已建立。第二个参数是NM正在调用的状态。
flamusdiu

-2

目前尚不清楚“时区更新”是什么意思。

Unix和Linux将时间保持为自1970年1月1日UTC 00:00以来的秒数。因此,Unix系统时钟与时区无关。Linux内核中不存在时区;仅当用户空间应用程序显示时间时,才使用时区解释自1970年以来的秒数。通常,这种解释是通过C库函数完成的。时区由TZ环境变量选择。时区定义(包括时区名称,与UTC的偏移量,夏令时生效的日期以及DST期间的偏移量)是GNU libc的一部分,通常在Linux发行版中作为“ tzdata”包提供。因此,在更新时区定义是运行的问题apt-get upgradeyum update或者一些类似的操作。

请注意,某些软件(例如Java)具有自己的时区定义文件,必须分别进行更新。

NTP跟踪自1900年1月1日UTC以来的秒数。因此,NTP和Unix内核一样,没有时区的概念。


2
时区更新,我们可以看到“ date”命令将根据/ etc / localtime时区打印时间和日期,我们可以通过创建/ usr / share / zoneinfo / America / Los_Angeles的符号链接来手动更改时区。但这是手动操作。我想要,它应该自动更新我所在国家的时区,而不是手动进行。
嵌入式程序员

简而言之,这是本地化的时间,但只有经常旅行的人才需要自动时区更新。
Cestarian
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.