2016-11-22 82 views
2

我试图将tzinfo应用于日期时间对象。Python日期时间和tzinfo对象(改变分钟而不是几小时)

In [1]: from datetime import datetime 
In [2]: import pytz 

In [3]: london = pytz.timezone("Europe/London") 
In [4]: london 
Out[5]: <DstTzInfo 'Europe/London' LMT-1 day, 23:59:00 STD> 

In [6]: localized_date_object = datetime(2016, 1, 1, 11, 30, 0, 5000, london) 
In [7]: localized_date_object 
Out[8]: datetime.datetime(2016, 1, 1, 11, 30, 0, 5000, tzinfo=<DstTzInfo 'Europe/London' LMT-1 day, 23:59:00 STD>) 

In [9]: utc_date_object = localized_date_object.astimezone(pytz.utc) 
In [10]: utc_date_object 
Out[11]: datetime.datetime(2016, 1, 1, 11, 31, 0, 5000, tzinfo=<UTC>) 

In [16]: paris = pytz.timezone("Europe/Paris") 
In [17]: localized_date_object = datetime(2016, 1, 1, 11, 30, 0, 5000, paris) 
In [18]: utc_date_object = localized_date_object.astimezone(pytz.utc) 
In [19]: utc_date_object 
Out[19]: datetime.datetime(2016, 1, 1, 11, 21, 0, 5000, tzinfo=<UTC>) 

正如您所看到的,它将增量应用于分钟而不是小时。
有人可以解释我在这里做错了吗?

回答

1

我认为你应该在巴黎时间和UTC时间使用伦敦时间的CET。 我使用的是有点不同的方法,但它为我工作:

from datetime import datetime 
from pytz import timezone 

ldo = datetime(2016, 1, 1, 11, 30, 0, 5000) 
ldo = ldo.replace(tzinfo=timezone('Europe/London')) 

udo = ldo.astimezone(timezone('UTC')) 
print ldo 
print udo 

ldo = datetime(2016, 1, 1, 11, 30, 0, 5000) 
ldo = ldo.replace(tzinfo=timezone('CET')) 

udo = ldo.astimezone(timezone('UTC')) 
print ldo 
print udo 

UPDATE:

当存储时间值应该可以同时存储相关的时区信息。 IMO的最佳做法是以UTC格式存储所有内容,并将其转换为“用户”时区。从UTC欧洲BTW转换/巴黎完美的作品,试试这个:

winter = datetime(2016, 1, 1, 11, 30, 0, 5000, tzinfo=timezone("UTC")) 
paris = winter.astimezone(timezone("Europe/Paris")) 
print paris 
# 2016-01-01 12:30:00.005000+01:00 

summer = datetime(2016, 6, 1, 11, 30, 0, 5000, tzinfo=timezone("UTC")) 
paris = summer.astimezone(timezone("Europe/Paris")) 
print paris 
# 2016-06-01 13:30:00.005000+02:00 
+0

谢谢你吉日。所以对于伦敦来说,冬天是UTC,夏天是BST。 – Sebabouche

+0

夏季法国的CEST;) – Sebabouche

+1

@Sebabouche这不是为您的城市确定正确时区的问题;-)当您在某处存储时间时,还应该存储相关时区信息(CET或CEST)。 IMO的最佳做法是以UTC格式存储所有内容,并将其转换为“用户”时区。从UTC到欧洲/巴黎的BTW转换完美无缺,请参阅更新答案。 – Jiri

0

在第5行显示一个奇怪的输出 - <DstTzInfo 'Europe/London' LMT-1 day, 23:59:00 STD>这似乎是一分钟的班次(减1天+ 23:59:00小时)。

我建议您尝试pytz中的其他几个时区定义来查看它们的声明。

0

时区欧洲/伦敦在UTC 1分钟后。时区欧洲/巴黎在UTC之前9分钟。伦敦和巴黎在地理上接近格林威治,所以时区偏移很小。

如果您尝试

pytz.timezone("Asia/Shanghai") 

,你会看到小时的变化。

+0

好了,所以我不希望在正确的地方,我一直在寻找传统的时区转换,+ 1H,-1H,像英国夏令时(BST)。但我标记你的答案是正确的;) – Sebabouche

相关问题