我有一个没有时区信息的datetime
。我现在正在获取时区信息,并希望将时区添加到现有的datetime实例中,我该怎么办?
d = datetime.datetime.now()
tz = pytz.timezone('Asia/Taipei')
如何将时区信息tz
添加到日期时间a
答案 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次这可能有意义(第二次发生在我身上):
datetime
实例( NOT a time
),以便稍后可以使用该属性来形成完整的datetime
实例。< / LI>
醇>