如何在Python中添加时区到天真的date时间实例
我有一个没有时区信息的datetime
。 我现在正在获取时区信息,并希望将时区添加到已存在的date时间实例,我该怎么办?
d = datetime.datetime.now() tz = pytz.timezone('Asia/Taipei')
如何将时区信息tz
添加到date时间a
使用tz.localize(d)
来本地化实例。 从文档 :
首先是使用pytz库提供的localize()方法。 这是用来本地化一个天真的date时间(date时间没有时区信息):
>>> 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()
会select给定date的右偏移量。 例如,美国东部时区的DST开始和结束date随时间而改变。
当您尝试本地化date时间值,因为它跨越了从夏季到冬季的过渡时期,因此会查询是否生成的date时间对象应具有.dst()
返回True或False。 您可以使用.localize()
的is_dst
关键字参数覆盖时区的默认值:
dt = tz.localize(naive, is_dst=True)
甚至通过设置is_dst=None
完全closuresselect。 在这种情况下,或者在极less数情况下,没有为时区设置默认值,那么模糊的date时间值将导致引发AmbiguousTimeError
exception。 只有在date时间值不明确的情况下才会is_dst
标志,否则将被忽略。
回到另一种方式,把时区感知对象转回到天真的对象,使用.replace(tzinfo=None)
:
naivedt = awaredt.replace(tzinfo=None)
如果您知道您的原始date时间是在您尝试添加的时区中“测量”的,则可以(但可能不应该)使用replace
而不是localize
。
# d = datetime.datetime.now() # tz = pytz.timezone('Asia/Taipei') d = d.replace(tzinfo=tz)
我可以想象两次,这可能是有道理的(第二次发生在我身上):
- 您的服务器语言环境设置为不正确的时区,并且您正在尝试通过使其知道这个不正确的时区来更正
datetime
实例(并且可能稍后将其本地化为“正确的”时区,以使now()的值匹配到其他时候,你是比较(你的手表,也许) - 你想用时区(tzinfo)属性“标记”一个
time
实例( 不是datetime
时间),这样这个属性可以在以后用来形成一个完整的datetime
实例。