私信  •  关注

Yongwei Wu

Yongwei Wu 最近创建的主题
Yongwei Wu 最近回复了
6 年前
回复了 Yongwei Wu 创建的主题 » Python-检查缩写的时区字符串是否有效[重复]

编辑:如果你不进一步否决这个答案,我将不胜感激。 答案是 错误的 ,但我宁愿把它作为历史笔记保留下来。虽然pytz接口是否容易出错仍有争议,但它可以做一些有助于dateutil的事情。tz不能这样做,尤其是在过去或未来的夏时制方面。我在一篇文章中诚实地记录了我的经历 "Time zones in Python" .


如果您使用的是类Unix平台,我建议您避免使用pytz,只查看/usr/share/zoneinfo。dateutil。tz可以利用那里的信息。

下面的代码显示了pytz可以给出的问题。当我第一次发现它时,我很震惊。(有趣的是,百胜在CentOS 7上安装的pytz没有出现这个问题。)

import pytz
import dateutil.tz
from datetime import datetime
print((datetime(2017,2,13,14,29,29, tzinfo=pytz.timezone('Asia/Shanghai'))
     - datetime(2017,2,13,14,29,29, tzinfo=pytz.timezone('UTC')))
     .total_seconds())
print((datetime(2017,2,13,14,29,29, tzinfo=dateutil.tz.gettz('Asia/Shanghai'))
     - datetime(2017,2,13,14,29,29, tzinfo=dateutil.tz.tzutc()))
     .total_seconds())

-29160.0
-28800.0

也就是说,pytz创建的时区是真实的当地时间,而不是人们观察的标准当地时间。上海符合+0800,而不是pytz建议的+0806:

pytz.timezone('Asia/Shanghai')
<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>

编辑: 多亏了马克·兰森的评论和否决票,现在我知道我用错了pytz。总之,你不应该通过考试的结果 pytz.timezone(…) datetime ,但应通过 约会时间 到它的 localize 方法

尽管他的论点(以及我对没有更仔细地阅读pytz文档的不满),我还是会保留这个答案。我用一种方式回答了这个问题(如何列举受支持的时区,尽管不是用pytz),因为我认为pytz没有提供正确的解决方案。虽然我的想法是错误的,但这个答案仍然提供了一些信息,IMHO,这对对对这个问题感兴趣的人可能有用。皮茨 对的 做事的方式是违反直觉的。见鬼,如果 tzinfo pytz创建的不应直接用于 约会时间 ,它应该是另一种类型。pytz接口设计得很糟糕。 Mark提供的链接表明,很多人,不仅仅是我,被pytz界面误导了。