为啥 Python 的 datetime.time 有 tzinfo 参数?

Posted

技术标签:

【中文标题】为啥 Python 的 datetime.time 有 tzinfo 参数?【英文标题】:Why Python's datetime.time have tzinfo parameter?为什么 Python 的 datetime.time 有 tzinfo 参数? 【发布时间】:2016-05-24 20:27:10 【问题描述】:

datetime,Python 的内置模块,有一些类。

但是我不能很好地理解datetime.time类的参数。

time 类有tzinfo 参数,默认为None

我想知道为什么time 类需要时区信息。

如果是datetime 类,它有.astimezone 方法,我们可以通过时区信息更改数据。但是time 类没有像.astimezone 这样的方法。

它只是为datetime.combine 类方法保留的吗?或者有什么关于时间和时区的重要故事?

【问题讨论】:

【参考方案1】:

我想知道为什么时间类需要时区信息。

我觉得它很有用,例如如果我们正在处理无论日期如何都在同一时间发生的事件(例如计划的作业),并且需要在不同的时区显示、操作和比较。

如何获得可识别 TZ 的 datetime.time 对象

datetime.timetz()

返回具有相同时、分、秒的时间对象, 微秒和 tzinfo 属性。另见方法 time()。

对于我的示例用例,我将从我的 tz-aware datetime.datetime 对象中提取 datetime.time 对象,使用 datetime.datetime.timetz(),它保留了 tzinfo

这将适合datetime.time 对象,而不是带有日期信息的datetime.datetime 对象。

但是时间类没有像 .astimezone 这样的方法。

您不能仅使用时间进行 TZ 转换

至于没有time.astimezone()的原因,我想可能是因为没有日期,无法猜测DST转换和其他非固定UTC偏移的影响。

【讨论】:

【参考方案2】:

time 类使用tzinfo 进行比较和操作。例如,美国/太平洋的上午 9:00 不等于美国/东部的上午 9:00。此外,如果您将感知时间与幼稚时间进行比较,python 可能会引发 TypeError,即将美国/太平洋地区的上午 9:00 与“上午 9:00”进行比较

来自the docs:

时间比较,当 a 在时间上先于 b 时,a 被认为小于 b。如果一个比较对象是幼稚的,而另一个是知道的,则在尝试进行顺序比较时会引发 TypeError。对于相等比较,朴素实例永远不会等于感知实例。

【讨论】:

以上是关于为啥 Python 的 datetime.time 有 tzinfo 参数?的主要内容,如果未能解决你的问题,请参考以下文章

Python - 计算两个 datetime.time 对象之间的差异

Python标准库datetime之time模块详解

python datetime模块

在 Python 3.4 中将 datetime.time 转换为 datetime.timedelta

python datetime模块参数详解

Python datetime模块参考手册