Python astimezone()意外结果

时间:2018-08-31 13:27:04

标签: python datetime

给出一个包含巴黎时区2000-01-01 00:01日期时间的变量(冬季afaik中为UTC + 2):

datetime.datetime(2000, 1, 1, 0, 1, tzinfo=pytz.timezone('Europe/Paris'))

我希望转换为UTC会导致日期时间为1999-12-31 22:01,但改为:

datetime.datetime(2000, 1, 1, 0, 1, tzinfo=pytz.timezone('Europe/Paris')).astimezone(pytz.utc)
datetime.datetime(1999, 12, 31, 23, 52, tzinfo=<UTC>)

我想念什么?

谢谢

1 个答案:

答案 0 :(得分:1)

  

不幸的是,使用标准tzinfo的{​​{1}}参数   构造器在许多时区都与datetime“不起作用”。

pytz
     

它对于没有夏令时转换的时区是安全的,例如UTC:

>>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=amsterdam).strftime(fmt)
'2002-10-27 12:00:00 LMT+0020'

您会注意到:

>>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=pytz.utc).strftime(fmt)
'2002-10-27 12:00:00 UTC+0000'

“ LMT + 0:09:00 STD”…?!那是历史的偏移,不是当前的标准。

>>> datetime.datetime(2000, 1, 1, 0, 1, tzinfo=pytz.timezone('Europe/Paris')) datetime.datetime(2000, 1, 1, 0, 1, tzinfo=<DstTzInfo 'Europe/Paris' LMT+0:09:00 STD>) 无法正确处理pytz返回的时区捆绑包(包含永远的所有历史偏移量),它选择了一些随机的(好吧, first 可能)偏移而不是与实际时间相关的偏移。可以说,由于它需要首先正确地解释时间,因此无法从时区束中选择正确的时间偏移。

  

此库仅支持构建本地化时间的两种方式。的   首先是使用datetime库提供的localize()方法。   这用于本地化没有时区的pytzdatetime   信息):

datetime
     

建立本地化时间的第二种方法是转换现有时间   使用标准>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0)) >>> print(loc_dt.strftime(fmt)) 2002-10-27 06:00:00 EST-0500 方法的本地化时间:

astimezone()
     

http://pytz.sourceforge.net