如何在Python中将时区添加到原始日期时间实例中

18 浏览
0 Comments

如何在Python中将时区添加到原始日期时间实例中

这个问题已经有答案了:

如何使Python中的datetime对象具有意识(非幼稚)?

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

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

如何将时区信息tz添加到日期时间a

admin 更改状态以发布 2023年5月23日
0
0 Comments

如果您知道您原始的日期时间是在您想要添加的时区中“测量”的,您可以(但可能不应该)使用 replace 而不是 localize

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

我可以想象出两种情况下这样做可能是有意义的(第二种情况发生在我身上):

  1. 您的服务器区域设置为错误的时区,您正在尝试通过使其意识到这个错误的时区来纠正一个 datetime 实例(并且可能稍后将其本地化到“正确”的时区,以便 now() 的值与您要比较的其他时间(例如您的手表)相匹配
  2. 您想要使用时区(tzinfo)属性“标记”一个 time 实例(不是 datetime),以便稍后可以使用该属性形成一个完整的 datetime 实例。
0
0 Comments

使用tz.localize(d)使时间实例本地化。从文档中得知:

首先使用pytz库提供的localize()方法。这用于将一个纯粹的datetime(没有时区信息的datetime)本地化:

>>> 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关键字参数来覆盖时区的默认设置:

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

甚至可以通过设置is_dst=None完全关闭选择。在这种情况下,或者在时区没有设置默认值的罕见情况下,不确定的datetime值将导致引发AmbiguousTimeError异常。is_dst标志仅在datetime值不确定时被查询,并在其他情况下被忽略。

要反向操作,将时区感知对象转回纯粹对象,请使用.replace(tzinfo=None)

naivedt = awaredt.replace(tzinfo=None)

0