如何在python中将时区添加到datetime实例中

How to add timezone into a naive datetime instance in python

本问题已经有最佳答案,请猛点这里访问。

我有一个没有时区信息的datetime。我现在正在获取时区信息,并希望将时区添加到现有的日期时间实例中,我该怎么做?

1
2
d = datetime.datetime.now()
tz = pytz.timezone('Asia/Taipei')

如何将时区信息tz添加到datetime a


使用tz.localize(d)将实例本地化。从文档中:

The first is to use the localize() method provided by the pytz library. This is used to localize a naive datetime (datetime with no timezone information):

1
2
3
>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0))
>>> print(loc_dt.strftime(fmt))
2002-10-27 06:00:00 EST-0500

如果不使用tz.localize(),而使用datetime.replace(),则可能使用历史偏移量;tz.localize()将选择给定日期生效的正确偏移量。例如,美国东部时区DST的开始和结束日期随时间而变化。

当您试图本地化日期时间值时,如果该值不明确,因为它跨越了从夏季到冬季的过渡期,或者反之亦然,则将查询时区,以查看生成的日期时间对象是否应使.dst()返回true或false。您可以使用.localize()is_dst关键字参数覆盖时区的默认值:

1
dt = tz.localize(naive, is_dst=True)

甚至可以通过设置is_dst=None完全关闭选择。在这种情况下,或者在极少数情况下,没有为时区设置默认值,不明确的日期时间值将导致引发AmbiguousTimeError异常。仅为不明确的日期时间值咨询is_dst标志,否则将忽略这些值。

要返回到另一个方向,请将时区感知对象返回到原始对象,使用.replace(tzinfo=None)

1
naivedt = awaredt.replace(tzinfo=None)


如果您知道您的原始日期时间是在您试图添加的时区中"测量"的,那么您可以(但可能不应该)使用replace,而不是localize

1
2
3
# d = datetime.datetime.now()
# tz = pytz.timezone('Asia/Taipei')
d = d.replace(tzinfo=tz)

我可以想象两次这可能有意义(第二次发生在我身上):

  • 您的服务器区域设置为不正确的时区,您正试图通过使datetime实例意识到这个不正确的时区来更正它(并可能在以后将其本地化为"正确"时区,以便now()的值与您将其与(可能是您的手表)进行比较的其他时间相匹配)。
  • 您希望用时区(TZINFO)属性"标记"一个time实例(不是datetime),以便该属性以后可以用于形成完整的datetime实例。