的符号链接/etc/localtime
如下所示:
===> ls -l /etc/localtime
... /etc/localtime -> /usr/share/zoneinfo/Europe/Berlin
我需要在环境变量中提供此信息TZ
。
这有效:
===> TZ=US/Pacific last reboot| head
reboot system boot 4.4.0-34-generic Thu Aug 25 02:12 still running
reboot system boot 4.4.0-34-generic Wed Aug 24 02:14 still running
但这并不:
===> TZ=Europe/Berlin last reboot| head
reboot system boot 4.4.0-34-generic Thu Aug 25 11:12 still running
reboot system boot 4.4.0-34-generic Wed Aug 24 11:14 still running
但这确实(从维基百科时区)
===> TZ=DE last reboot| head
reboot system boot 4.4.0-34-generic Thu Aug 25 09:12 still running
reboot system boot 4.4.0-34-generic Wed Aug 24 09:14 still running
TZ
我根据 的链接搜索了一个设置方法/etc/localtime
。
这应该是自动化的并且适用于所有时区。
最后--版本:util-linux 2.27.1
===> cat /etc/adjtime
0.0 0 0.0
0
LOCAL
更新
内部数据库中的记录似乎有误:
root pts/20 127.0.0.1 Thu Aug 25 13:29 - 13:29 (00:00)
modwork_ pts/17 127.0.0.1 Thu Aug 25 10:38 - 11:37 (00:59)
modwork_ pts/18 127.0.0.1 Thu Aug 25 10:05 - 10:19 (00:13)
tguettle tty7 :0 Thu Aug 25 09:12 gone - no logout
reboot system boot 4.4.0-34-generic Thu Aug 25 11:12 still running
答案1
您的硬件时钟以本地时间而不是 UTC 运行,因此启动时间戳存储不正确。 (这由LOCAL
中的条目指示/etc/adjtime
。)last
不会对此进行调整,因此它显示的启动时间会根据您的时区和 UTC 之间的差异而变化(目前柏林为两个小时)。我认为除了将硬件时钟更改为 UTC 之外,没有任何方法可以解决此问题!
该答案的其余部分与您的实际问题无关,但在考虑TZ
和时仍然相关/etc/localtime
。
一般来说,要在 中使用基于文件的值TZ
,您应该在文件名前加上前缀:
(请参阅tzset(3)
详情):
TZ=:Europe/Berlin last reboot|head
这适用于任何可用作/etc/localtime
.如有必要,TZDIR
可用于覆盖默认位置 ( /usr/share/zoneinfo
)。
(这是假设您正在运行带有glibc
;的 Linux,:
它是依赖于实现的由 POSIX 定义。在 Linux 上,通常不需要,:
因为两种形式TZ
都已尝试。)
答案2
美国/太平洋地区8 月 25 日星期四 02:12 是欧洲/柏林8 月 25 日星期四 11:12,因为柏林时间比美国太平洋时间早 9 小时
$ TZ=US/Pacific date -d 'Thu Aug 25 02:12' +%s
1472116320
$ TZ=Europe/Berlin date -d 'Thu Aug 25 11:12' +%s
1472116320
查看 UTC 偏移量:
$ TZ=Europe/Berlin date +%z
+0200
$ TZ=US/Pacific date +%z
-0700
所以你的第二个例子作品。这是第三个没有的工作。
TZ=DE
作为标准 ( XXX[offset][YYY[dstoffset]]
) 区域定义是无效的,因为它只有 2 个字母,并且 /usr/share/zoneinfo 中可能没有调用任何文件DE
,因此它默认为 UTC 时间。
$ TZ=DE date +%z
+0000
如果您确实在柏林时间 9:12(即 Unix 时间 1472109120)启动系统,那么这将表明您的时钟在该条目添加到 中时晚了两个小时wtmp
。
init
这是系统启动时首先要做的事情之一。这通常是在网络时间同步服务(将纠正该时钟)启动之前。你的另一个正确的wtmp 条目表明时钟在第一个人登录时已修复。
如果您的系统是多重启动的,并且其他系统之一是由 Microsoft 制作的,请注意 Microsoft 系统有一个错误/错误功能,因为它们默认将硬件时钟设置为本地时间而不是 UTC。因此,如果您的类 Unix 操作系统期望硬件时钟为 UTC,则会发生冲突,当您在 Microsoft 操作系统上启动时,操作系统会尝试将硬件时钟从 UTC 转换为本地时间,而您的 Unix 操作系统会做相反的事情。
根据那里,看来已经不可能了使固定Microsoft 操作系统,因此您需要通过告诉您的 Unix 操作系统将硬件时钟设置为本地时间(就像在 Windows 上一样)来解决这个问题(并确保所有操作系统都同意本地时间的含义)(并确保您不这样做)在 DST 更改期间/期间不要关闭或重新启动)。例如,在当前的 Debian 系统上,这是通过更改UTC
为LOCAL
in来完成的/etc/adjtime
。
现在,由于您adjtime
已经包含LOCAL
,因此排除了该假设。其他可能性:您有另一个将时钟设置为 UTC 的系统,或者它是一个将本地时间设置为 UTC 的 Microsoft 系统。更改LOCAL
为UTC
可能会解决问题。
或者更一般地说,您希望系统上的所有操作系统就硬件时钟的设置达成一致。