关于ZAKER 融媒体解决方案 合作 加入

奇怪的 .astimezone 行为

CocoaChina 10-23

我正在进行一些时区转换 , 但结果却很奇怪 . 基本上在仅整小时不同的时区之间进行转换 , 我仍然得到非整体结果 . 例如:

from datetime import datetimefrom pytz import timezonedatetime ( 2013, 12, 27, 20, 0, 0, tzinfo=timezone ( 'Europe/Bucharest' ) ) n .astimezone ( timezone ( 'Europe/Berlin' ) ) .replace ( tzinfo=None )

给我

datetime.datetime ( 2013, 12, 27, 19, 16 )

( 布加勒斯特和柏林之间的时差是 1 小时 , 所以我应该得到 19:00- 而是得到 19:16 )

我可能错过了一些确实很明显的东西 , 但我无法弄清楚 . 我究竟做错了什么?

最佳答案

pytz documentation所指定:

Unfortunately using the tzinfo argument of the standard datetime constructors ‘’ does not work ’’ with pytz for many timezones.

确实 , 这不是预期的结果 , 时区错误:

>>> datetime ( 2013, 12, 27, 20, 0, 0, tzinfo=timezone ( 'Europe/Bucharest' ) ) datetime.datetime ( 2013, 12, 27, 20, 0, tzinfo=<DstTzInfo 'Europe/Bucharest' BMT+1:44:00 STD> )

这说明了在给定时区 ( ‘ Europe / Bucharest ’ ) 时区的 pytz 构造函数不检查何时应考虑时区偏移量的情况下 , 这些情况会随着时间而改变 . pytz 只使用较早的已知定义 , 这通常是错误的:

>>> timezone ( 'Europe/Bucharest' ) <DstTzInfo 'Europe/Bucharest' BMT+1:44:00 STD>

看起来该时区已使用until 1931.

使用 UTC 时间并使用 astimezone 转换时间时 , 没有这样的问题 ( 仅出于建议的目的显示 ) :

>>> datetime ( 2013, 12, 27, 20, 0, 0, tzinfo=pytz.utc ) n .astimezone ( timezone ( 'Europe/Bucharest' ) ) datetime.datetime ( 2013, 12, 27, 22, 0, tzinfo=<DstTzInfo 'Europe/Bucharest' EET+2:00:00 STD> )

然后 , 您将获得预期的结果:

>>> datetime ( 2013, 12, 27, 20, 0, 0, tzinfo=pytz.utc ) n .astimezone ( timezone ( 'Europe/Bucharest' ) ) n .astimezone ( timezone ( 'Europe/Berlin' ) ) n .replace ( tzinfo=None ) datetime.datetime ( 2013, 12, 27, 21, 0 )

以上内容由"CocoaChina"上传发布 查看原文
相关标签 行为

觉得文章不错,微信扫描分享好友

扫码分享