我有一台可以双启动 Kali Linux 和 Windows 的机器。我运行测试时的正确当地时间是 11:19 IST(印度标准时间),当然是 05:49 UTC。正如您从这个问题的编辑历史中看到的,我最初是在几分钟后的 05:58 UTC 发布的。
该date
命令得到的时区是正确的,但时间却完全错误。
$ date
Wednesday 19 August 2020 04:49:10 PM IST
正如问题评论中所述,这是 12 小时制,即 24 小时制的 16:49:10。该命令报告的当地时间date
比实际时间早了 5 个半小时。
我桌面上 GUI 时钟的时间是 11:19,这是正确的。
大约一分钟前我运行了这个:
$ timedatectl
Local time: Wed 2020-08-19 16:47:50 IST
Universal time: Wed 2020-08-19 11:17:50 UTC
RTC time: Wed 2020-08-19 11:17:51
Time zone: Asia/Kolkata (IST, +0530)
System clock synchronized: no
NTP service: inactive
RTC in local TZ: no
正如您所看到的,时区是正确的,但当地时间却非常错误。有趣的是,如果那里的“世界时间”是 IST 而不是 UTC,那就是对的。
我不明白为什么会发生这种情况。为什么?我如何解决它?
答案1
为了完整起见,请确保您的默认时区是正确的(因为它已经说明Asia/Kolkata
并且IST
您可能看到的是,此步骤很大程度上是多余的):
#dpkg-重新配置 tzdata
当然,如果您尚未运行超级用户 shell,请使用sudo
或。su
然后使用从某些 NTP 服务器获取时间的守护进程将系统时钟与正确的 UTC 时间同步(安装ntp包如果尚未安装,则为此):
#ntpd-qg
该-q
选项告诉ntpd
您只需设置一次时间并退出。它不会成为守护进程。这种一次性模式ntpd
相当于独立ntpdate
命令。
该-g
选项很重要,原因参见“使用 NTP 同步时间的推荐方法是什么?“。你的时钟是多很多与正确的 UTC 值相差超过 1000 秒。相差五个半小时。如果不使用该-g
选项,ntpd
将简单地拒绝纠正这种情况。
(当然还有其他方法可以将系统时钟重新设置为正确的 UTC 时间。您可以在机器固件的 SETUP 实用程序中手动输入它,甚至可以使用命令手动输入它date
。除此之外,您还可以使用其他工具从ntpd
现在开始与 NTP 服务器保持同步,例如chronyd
慢性包例如。)
为什么
发生的事情是这样的。当您仅运行 Windows 时,Windows 将硬件实时时钟 (RTC) 解释为本地 (IST) 时间。您安装了基于 Linux 的操作系统(这不仅适用于 Kali Linux),但是没有解决冲突基于 Linux 的操作系统(实际上是一般的类 Unix 操作系统)和 Windows 之间。
Windows 认为并且仍然毫无疑问地认为您的实时时钟正在报告本地 (IST) 时间。通常,基于 Linux 的操作系统认为您的实时时钟报告的是通用 (UTC) 时间。注意,实际的时钟硬件没有时区寄存器;因此,由每个操作系统决定时钟中的日期和时间寄存器实际代表什么,时钟被理解为在哪个时区运行。
这是一个根本性的冲突。你需要修复它。
基于 Linux 的操作系统通常会选择以与 Windows 相同的方式解释实时时钟寄存器,但由于多种原因,这是一个糟糕的选择,这将是(并且在 WWW 上到处都是)一个完整的问答本身。更好的选择是让 Windows 和基于 Linux 的操作系统都同意将 RTC 寄存器理解为读取一个普遍的(UTC) 日期和时间。
您可以通过配置 Windows 来完成此操作;有一个相当广为人知的注册表设置。实际上你不需要在Linux端做任何事情除了用于将 RTC 与 UTC 日期和时间同步。正如您从timedatectl
运行它时的输出中看到的那样,您已经有 Asia/Kolkata
作为您的(默认)时区和已经有“本地 TZ 中的 RTC”(即“将 RTC 注册为本地,与 Windows 的方式相同”)设置为“否”。
如果在您有机会重新配置并重新启动 Windows 之前,Windows 恰好将 RTC 重新同步回 IST 值,则您将需要再次同步回 UTC 值。
那么为什么你的 GUI 时钟是正确的呢?具有讽刺意味的是,这是因为您没有在其或您的桌面设置中配置正确的 IST 时区。它向您显示 UTC 时间,或者可能是都柏林/伦敦/里斯本/巴马科/弗里敦/亚穆苏克罗时间,因为在您的系统上,操作系统从 RTC 获取的“UTC 时间”实际上是当地的IST 时间值,由 Windows 设置,您的 GUI 时钟显示 UTC 时间只是碰巧看起来不错。
这与报告的“世界时间”timedatectl
具有当地时间的正确日期和时间的原因相同。任何报告您的基于 Linux 的操作系统当前的想法UTC 实际上是报告本地 IST 日期和时间。
概括
所以你需要
- 将实时时钟校正为真的UTC 日期和时间(
ntpd
如上所述,在开机时,甚至在 Windows 中,在机器固件的 SETUP 实用程序中手动设置),以及 - 重新配置 Windows,使其就操作系统读取实时时钟的方式达成一致。
进一步阅读
- 马库斯·库恩 (2001)。 IBM PC 实时时钟应在 UT 中运行。 cl.cam.ac.uk。
- https://wiki.archlinux.org/index.php/System_time#UTC_in_Windows