/etc/timezone 有什么用?

Tom*_*ale 7 arch-linux date timezone clock manjaro

在我的 Manjaro linux 机器上,我有一个文件/etc/timezone,其中包含:

Asia/Bangkok
Run Code Online (Sandbox Code Playgroud)

另一个 Manjaro 论坛用户也有相同的文件。该线程总体上包含有关此问题的一些现有技术。

奇怪的是timedatectl status不使用这个文件来报告Region/City. 这是初始状态:

$ timedatectl status                                          
                      Local time: Fri 2018-06-29 11:01:28 +07       
                  Universal time: Fri 2018-06-29 04:01:28 UTC    
                        RTC time: Fri 2018-06-29 04:01:28        
                       Time zone: Asia/Bangkok (+07, +0700)             
       System clock synchronized: no                          
systemd-timesyncd.service active: no                              
                 RTC in local TZ: no                            
Run Code Online (Sandbox Code Playgroud)

现在我/etc/localtime用它指向的文件内容覆盖符号链接:

$ sudo ln -f "$(realpath /etc/localtime)" /etc/localtime          
$ timedatectl status                                           
                      Local time: Fri 2018-06-29 04:04:03 UTC
                  Universal time: Fri 2018-06-29 04:04:03 UTC
                        RTC time: Fri 2018-06-29 04:04:04
                       Time zone: n/a (UTC, +0000) 
       System clock synchronized: no                               
systemd-timesyncd.service active: no
                 RTC in local TZ: no  
Run Code Online (Sandbox Code Playgroud)

请注意本地时间更改以匹配 UTC 和n/a时区。

因此,timedatectl不会从 读取/etc/timezonetimedatectl set-timezone也不会写入/etc/timezone

除了那个猜测,我的/etc/timezone还是个谜。

  1. 写什么呢?
  2. 读什么?
  3. 做什么的?

Gil*_*il' 8

GNU libc(以及任何非嵌入式 Linux)读取/etc/localtime以确定系统的时区(如果没有被TZ环境变量或特定于应用程序的设置覆盖,则为默认时区)。*BSD 做同样的事情。一些嵌入式 Linux 系统以不同的方式做事。

/etc/localtime应该是指向/usr/share/zoneinfo/. 普通应用程序不介意,它们只读取文件的内容,但系统管理实用程序(例如)timedatectl更关心,因为它们也可以更改设置,并且它们会通过更改符号链接的目标来实现。

Java 做了(或做了?)了不同的事情:它读取/etc/timezone,其中包含一个时区名称,它应该是相对于/usr/share/zoneinfo. 我不知道有任何其他程序使用/etc/timezone,我不知道为什么 Sun 选择以与世界其他地方不同的方式做事。

  • 使用 glibc 时间函数的程序将自动使用 `/etc/localtime`。但是拥有自己的时区数据库的程序(例如 Java)只需要系统默认时区的**名称**:这在“/etc/localtime”中不容易获得,因为它在历史上可能是系统默认时区的“副本” `/usr/share/zoneinfo` 中的适当文件,而不是它的符号链接。因此,发行版制造商也将系统时区的**名称**存储到另一个位置:RedHat 将其存储在 `/etc/sysconfig/clock` 中,Debian 将其存储在 `/etc/timezone` 中。现在 `/etc/localtime` 可能与其他地方不同步...... (5认同)