根据位置自动设置Linux时区

根据位置自动设置Linux时区

如何在Linux中利用Internet自动设置系统默认时区?据我所知,NTP 服务器只能更新时间,而不能更新时区。有没有可以更改时区的服务器?

答案1

我不久前写了一个程序,它是这样做的:更新时间

您可以通过运行以下命令来查看它将您的时区设置为什么(无需实际设置)tzupdate -p

$ tzupdate -p
Europe/Malta

您可以通过以 root 身份运行来设置它tzupdate

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

这是通过以下方式实现的:

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

答案2

这是一个旧线程,但仍然与 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 运行而无需密码。当我们从在后台运行此命令的网络管理器触发此命令时,后续步骤需要此命令。在终端中键入此命令以编辑 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 将调用执行 sudo(即 sudo tzupdate),这通常会提示输入密码。

    可能有更好的方法来做到这一点,即让 NetworkManager 仅在连接建立时调用它,而不是在连接断开时调用它(如上面的操作) - 我尝试将脚本放入 /etc/network/if-up .d 但这对我不起作用

  6. 要在 Kubuntu 中进行测试 - 将您的本地时区更改为其他时区(转到任务栏中的“日期等离子体”,右键单击并选择“调整日期/时间”,然后从选项卡中选择“时区”)

    关闭你的 wifi 然后重新打开 - 你会看到一旦连接到 wifi,它似乎会等待大约 30 秒,然后应该成功更改你的时区。

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

答案3

  • 安装geoclue。 Ubuntu/Debian: sudo apt install geoclue-2.0. Arch Linux sudo pacman -S geoclue:.
  • 如果您使用的是 GNOME Classic(对于常规 GNOME 应该是类似的):
    • 设置 -> 隐私 -> 设置Location Services为“打开”位置服务
    • 设置 -> 日期和时间 -> 将Automatic Time Zone和设置Automatic Date & Time为“打开” 自动时区

答案4

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

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

请注意,某些软件(例如 Java)有自己的时区定义文件,必须单独更新。

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

相关内容