更新

更新

的符号链接/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 系统上,这是通过更改UTCLOCALin来完成的/etc/adjtime

现在,由于您adjtime已经包含LOCAL,因此排除了该假设。其他可能性:您有另一个将时钟设置为 UTC 的系统,或者它是一个将本地时间设置为 UTC 的 Microsoft 系统。更改LOCALUTC可能会解决问题。

或者更一般地说,您希望系统上的所有操作系统就硬件时钟的设置达成一致。

相关内容