首页 > 解决方案 > 在 Ubuntu 18.04 上通过命令行启用/禁用夏令时

问题描述

注意:通过“禁用”夏令时,我的意思是系统时钟忽略夏令时的任何时间更改(即,如果 DST 被禁用,那么时钟将不会在 3 月“向前”一个小时,也不会“后退”11 月的一个小时。

我正在设计一个在 Ubuntu 18.04 上运行的 Qt 应用程序,我需要能够设置系统时区、时间和日期。

对于设置时间和日期,我可以很容易地使用timedatctl来修改系统设置。但是,此命令似乎确实能够禁用夏令时。它会根据时区和日期报告 DST 是否为“活动”,但您无法禁用/启用此设置。

在 Windows 上,我使用tzutil.exe设置启用或不使用 dst_off 标志的 DST。有没有与 Ubuntu 等价的东西?

标签: datetimeubuntucommand-linetimezonedst

解决方案


我将从时区的角度回答这个问题。

禁用 DST 通常不是一件好事。这些功能忽略了时区的现实。时区由世界各地的各个政府定义,而这些政府决定 DST 何时何地生效。

例如,我位于美国华盛顿州的雷德蒙德。根据美国法律,它位于太平洋时区,标准时间为 UTC-8,白天为 UTC-7。美国法律目前允许各州选择退出夏令时,亚利桑那州和夏威夷已经这样做了。但华盛顿没有,因此夏令时适用于我这里。现在(7 月)在我写这篇文章时是太平洋夏令时间 11:00。我不能自己决定它的太平洋标准时间 10:00。我必须搬迁到不同的时区才能做到这一点。

在大多数系统(包括 Ubuntu)中使用的IANA 时区数据库(TZDB、Olson 等)中的时区定义了至少自 1970 年以来本地时间已一致的世界各地的不同区域。如果有区域共享相同的标准时间,但他们是否获得 DST 或何时适用 DST 不同,然后他们在 TZDB 中获得自己不同的条目。换句话说,说“我想在America/Los_Angeles没有 DST 的情况下进入”是没有意义的,因为在太平洋时区没有地方可以这样做。如果您在皮特凯恩群岛(UTC-8 没有 DST),那么您只需使用Pacific/Pitcairn.

也许是一个更清楚的例子:美国山区时间的大部分时间使用 MST (UTC-7) 和 MDT (UTC-6),它获取 TZDB 标识符America/Denver。亚利桑那州大部分不使用夏令时,全年使用 MST (UTC-7),因此它America/Phoenix在 TZDB 中获得了自己的标识符。

那么你可能会问,为什么 Windows 有“禁用 DST”功能?我可以公开谈论的原因有几个(披露:我在微软工作,偶尔在这个领域工作)。

  • Windows 时区功能最初是使用 Windows NT 创建的。当时,Olson 数据库已经存在,但并不像今天这样无处不在。Microsoft 决定创建自己的实现,因此至今有两种不同的时区数据来源。TZDB 和微软。

  • 以前的情况是 Windows 时区数据无法覆盖整个世界。因此,一些 Windows 用户不得不依靠此功能来获得准确的时间。随着2016 年 6 月的更新,这种情况发生了巨大变化,以符合微软的使命宣言“......地球上的每个人和每个组织......”。今天,有确保时区数据准确的承诺和政策。

  • 当政府决定更改他们的时区(制定 DST、暂停 DST、更改 DST 日期或时间、更改标准时间偏移等)时,立法者有时会犯一个重大错误,即没有提供足够的提前期(请参阅我的关于这个主题的博客文章)。发生这种情况时,Microsoft 可能会就如何获取正确的本地时间提供建议的临时指导,直到可以提供更新为止。此类指导可能包括禁用 DST 或切换到不同的时区。这些建议总是临时的,因此该功能是否需要存在变得有争议。

一般来说,大多数 Windows 用户永远不应该禁用 DST。如果他们发现自己需要这样做以获取正确的本地时间(上述罕见情况除外),他们可能只是一开始就没有将他们的时区设置为正确的条目。

Ubuntu 和其他操作系统上的 TZDB 时区往往比 Windows 具有更短的更新周期,因此不会受到短期通知更改的严重影响。


推荐阅读