2012-12-21 26 views

回答

47

使用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的开始和结束日期随时间而改变。

当你尝试,因为它横跨从夏天到冬天的时候,反之亦然过渡时期本地化日期时间值是模糊的,时区将进行协商,看是否产生DateTime对象应该有.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) 
+0

完美解决,谢谢。 – waitingkuo

+0

有没有方便的方法从'datetime'获得天真的'datetime',它有tzinfo? – waitingkuo

+4

@waitingkuo:在'datetime'对象上调用'.replace(tzinfo = None)'。返回值是一个天真的'datetime'实例。 –

2

如果你知道你原来的日期时间在你的时区是“测量”试图增加它,你可以(但可能不应该)使用replace而不是localize

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

我能想象的2倍时,这可能是有意义的(第二个发生在我身上):

  1. 您的服务器的区域设置为不正确的时区和您正试图纠正datetime通过使它知道这个不正确的时区(大概是后来将它定位到“正确的”时区,以使now()的值匹配到其他时间(可能是您的手表)
  2. 你想要以“标记”实例(不是 a datetime)与时区(tzinfo)属性相关联,以便稍后可以使用该属性来形成完整的datetime实例。
相关问题