Python 3.6+ 本地时间消歧 (PEP 495)

  • 本文关键字:PEP 时间 Python python-3.6
  • 更新时间 :
  • 英文 :


我有一些关于PEP 495的问题。

datetime模块中的类(嗯,其中一些)现在接受一个fold参数,默认情况下该值是0的,并且该值也可以设置为1

例如,datetime.datetime(..., fold=1).

在我的国家(斯洛文尼亚,中欧),我们将时间提前一小时,在凌晨2点到凌晨3点之间设置一小时。在其他国家,我认为是在凌晨 1 点到 2 点之间。

第一个问题:这fold是否足够智能,可以确定夏令时是在凌晨 2 点到凌晨 3 点之间设置的,还是设置在凌晨 1 点到凌晨 2 点之间?

第二个问题:因此,将fold设置为1会考虑夏令时,对吗?这就是它的作用吗?

第三个问题:我对fold论点的理解是否正确?

什么是折叠?

折叠是模棱两可的本地时间。每当时钟向后移动时,就会发生这种情况。以德国的下一次变化为例:

2017 年 10 月 29 日凌晨 3 点,时钟将回到凌晨 2 点。

现在想象一下,你告诉某人你想在2017年10月29日凌晨2:30见面。你的意思是在时间变化发生之前还是之后?这是模棱两可的,因为时钟在两个时间点显示这个确切的时间。

PEP 495 添加的折叠属性正好提供了该信息。时间更改的时间为 0,时间更改的时间为 1。

PEP 495 中是这样描述的:

此 PEP 向 datetime.time 和 datetime.datetime 类的实例添加了一个新的属性折叠,可用于区分本地时间相同的两个时刻。折叠属性的允许值将为 0 和 1,其中 0 对应于不明确的本地时间的两个可能读数中的较早值,1 对应于较晚的读数。

夏令时和datetime对象

来自 python datetime 文档:

日期和时间

对象有两种:"朴素"和"感知"。

感知对象对适用的算法和政治时间调整(例如时区和夏令时信息)有足够的了解,可以相对于其他感知对象定位自身。感知对象用于表示无法解释的特定时刻[1]。

朴素对象不包含足够的信息,无法相对于其他日期/时间对象明确定位自身。朴素对象是否代表协调世界时 (UTC)、本地时间或其他时区的时间完全取决于程序,就像特定数字是否表示米、英里或质量取决于程序一样。朴素的对象很容易理解和使用,但代价是忽略了现实的某些方面。

对于需要感知对象的应用程序,日期时间和时间对象具有可选的时区信息属性 tzinfo,该属性可以设置为抽象 tzinfo 类的子类的实例。这些 tzinfo 对象捕获有关 UTC 时间偏移量、时区名称以及夏令时是否有效的信息。请注意,datetime 模块仅提供一个具体的 tzinfo 类,即时区类。时区类可以表示与 UTC 具有固定偏移量的简单时区,例如 UTC 本身或北美 EST 和 EDT 时区。是否支持更深层次的细节时区取决于应用程序。世界各地的时间调整规则更多的是政治性的而不是理性的,经常变化,除了UTC之外,没有适合每个应用程序的标准。

TL;博士:

标准库提供:

  • 明确的本地时间(对原本模棱两可的时间使用 fold 参数)。
  • 可用于实现时区和夏令时信息的datetime对象的tzinfo属性。

标准库不提供:

  • 知道夏令时的不同时区之间的时间转换。

回答您的问题

此折叠是否足够智能,可以确定夏令时是在凌晨 2 点到凌晨 3 点之间设置的,还是设置在凌晨 1 点到凌晨 2 点之间?

不,它不是,甚至 python 标准库也没有提供这个。我确信有第三方库可以做到这一点,但直到现在我还没有使用过它们中的任何一个。

因此,将折叠设置为 1 会考虑夏令时,对吧?这就是它的作用吗?

没有。折叠参数的含义更像是"这是时钟显示这次的第一次还是第二次"。您只需要此参数来表示时钟向后移动的(通常)一小时。除了这种情况,本地时间是明确的,所以你不需要折叠参数。是否是夏令时与争论无关。

我对折叠论证的理解是否正确?

不是真的,但我希望我能通过上面的答案来阐明一些问题。

最新更新