51

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

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

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

4

2 回答 2

85

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

第一种是使用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()返回 True 或 False。is_dst您可以使用以下关键字参数覆盖时区的默认值.localize()

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

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

要返回另一种方式,将时区感知对象转回天真对象,请使用.replace(tzinfo=None)

naivedt = awaredt.replace(tzinfo=None)
于 2012-12-21T17:31:07.627 回答
18

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

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

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

  1. 您的服务器语言环境设置为不正确的时区,并且您试图datetime通过让实例知道这个不正确的时区来更正实例(并且可能稍后将其本地化为“正确”时区,以便 now() 的值与其他时区匹配您将其与(也许是您的手表)进行比较的时间
  2. 您想用时区 (tzinfo) 属性“标记”一个time实例 ( NOT a datetime),以便以后可以使用该属性来形成一个完整的datetime实例。
于 2015-03-25T18:22:49.973 回答