为什么

为什么

我有一台可以双启动 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,使其就操作系统读取实时时钟的方式达成一致。

进一步阅读

相关内容