【问题标题】:python-tz am I wrong or it's a bugpython-tz 我错了还是错误
【发布时间】:2011-01-11 09:17:52
【问题描述】:

似乎有点奇怪,当我想用​​ pytz 获得欧洲/巴黎的时区时,它让我进入 PMT 时区而不是 GMT+1,而它似乎适用于欧洲/柏林。

不清楚?看看这个 sn-p :

#!/usr/bin/python
import os
import datetime
from pytz.tzfile import build_tzinfo

base='/usr/share/zoneinfo/'
tz = build_tzinfo('Europe/Paris',
                  open(os.path.join(base,'Europe','Paris'), 'rb'))
fmt = '%Y-%m-%d %H:%M:%S %Z%z'
print datetime.datetime(2009, 01, 30, 9, 00, tzinfo=tz).strftime(fmt)

tz = build_tzinfo('Europe/Berlin',
                  open(os.path.join(base,'Europe','Berlin'), 'rb'))

print datetime.datetime(2009, 01, 30, 9, 00, tzinfo=tz).strftime(fmt)

输出是:

2009-01-30 09:00:00 PMT+0009
2009-01-30 09:00:00 CET+0100

真正的巴黎也应该是 CET+1。

从 datetime.datetime.now(tz) 构造无论如何都会得到正确的结果。

有人有想法吗?

【问题讨论】:

标签: python timezone


【解决方案1】:

The docs 说你不能像现在这样使用datetime.datetime(..., tzinfo)

不幸的是,对于许多时区,使用标准日期时间构造函数的 tzinfo 参数对 pytz 不起作用

奇怪的是,尽管有种种迹象表明 Europe/Paris 时区是错误的,但当您按照它的建议实际使用 localize 时,它仍然有效:

>>> tz= pytz.timezone('Europe/Paris')               # using built-in zoneinfo
>>> tz
<DstTzInfo 'Europe/Paris' PMT+0:09:00 STD>          # what? Pierre et Miquelon Time?
>>> datetime.datetime(2010,1,1,12,0,0, tzinfo=tz)
datetime.datetime(2010, 1, 1, 12, 0, tzinfo=<DstTzInfo 'Europe/Paris' PMT+0:09:00 STD>) # bad
>>> tz.localize(datetime.datetime(2010,1,1,12,0,0))
datetime.datetime(2010, 1, 1, 12, 0, tzinfo=<DstTzInfo 'Europe/Paris' CET+1:00:00 STD>) # OK

请注意,本地化日期时间的 tzinfo 属性引用了与创建它的 tz 完全不同的对象,仅共享名称。

这对我来说是个谜。理解多个时区名称的城市文件似乎是一个问题,但是为什么直到您致电 localize 才能获得城市的默认时区,我不知道。

(说实话,我从不信任 Python 的 datetime 和 tzinfo 东西。更喜欢使用 int UTC 时间戳。)

【讨论】:

  • 总的来说,Python 的时区设计非常糟糕。 “幼稚”时代的概念是无用的,而且过于复杂。应该只有一种类型的日期时间,它应该默认为 UTC,而不是“未知”(天真)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2011-01-10
  • 2013-09-06
  • 1970-01-01
相关资源
最近更新 更多