如何在python中将时区添加到天真的日期时间实例中

时间:2012-12-21 17:30:06

标签: python datetime timezone pytz

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

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

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

2 个答案:

答案 0 :(得分:55)

使用tz.localize(d)本地化实例。来自documentation

  

第一种方法是使用pytz库提供的localize()方法。这用于本地化一个天真的日期时间(没有时区信息的日期时间):

>>> 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()返回对或错。您可以使用is_dst的{​​{1}}关键字参数覆盖时区的默认值:

.localize()

甚至可以通过设置dt = tz.localize(naive, is_dst=True) 完全关闭选项。在这种情况下,或者在极少数情况下, 没有为时区设置默认值,不明确的日期时间值将导致引发is_dst=None异常。 AmbiguousTimeError标志仅针对不明确的日期时间值进行查询,否则将被忽略。

要以另一种方式返回,将时区感知对象转回原始对象,请使用is_dst

.replace(tzinfo=None)

答案 1 :(得分:5)

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

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

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

  1. 您的服务器区域设置被设置为不正确的时区,并且您正在尝试通过让{#1}}实例知道此不正确的时区来进行更正(并且可能稍后将其本地化为"更正"时区所以now()的值与你将它(可能是你的手表)
  2. 进行比较的其他时间相匹配
  3. 你想&#34;标记&#34;具有时区(tzinfo)属性的datetime实例( NOT a time),以便稍后可以使用该属性来形成完整的datetime实例。< / LI>