7

正确值:

>>> pytz.timezone('Asia/Tehran').utcoffset(datetime(2013, 1, 1)).total_seconds()/3600.0
3.5

>>> pytz.timezone('Asia/Tehran').utcoffset(datetime(2013, 1, 1)).total_seconds()
12600.0

不正确的值:

>>> pytz.timezone('Asia/Tehran')._utcoffset.total_seconds()/3600.0
3.433333333333333

>>> pytz.timezone('Asia/Tehran')._utcoffset.total_seconds()
12360.0

我想知道该_utcoffset属性是否在utcoffset()方法中使用,为什么该方法在属性错误时起作用。
无论如何看起来像一个错误。
如果您替换Asia/TehranIran

>>> print pytz.VERSION
2012c


操作系统:使用 Python 2.7的 Linux Mint 15 (Olivia)

4

1 回答 1

12

让我们看看这里发生了什么:

>>> tz = pytz.timezone('Asia/Tehran')
>>> tz
<DstTzInfo 'Asia/Tehran' LMT+3:26:00 STD>

这意味着时区以LMT表示,即太阳时。这就是为什么您会看到 12360 的 utcoffset - 这里没有错误,它只是使用不同的参考计算得出的。

现在,如果你这样做:

>>> d = tz.localize(datetime(2013, 1, 1))
>>> d
datetime.datetime(2013, 1, 1, 0, 0, tzinfo=<DstTzInfo 'Asia/Tehran' IRST+3:30:00 STD>)
>>> d.utcoffset()
datetime.timedelta(0, 12600)

localize方法导致表示切换到该日期和地点使用的正确时区,即 IRST,utcoffset 为 12600 秒。

这正是 tzinfo 对象的utcoffset方法所做的——它本地化给定的 datetime 对象并返回它的 utcoffset。

同样,如果您目前这样做:

>>> d = datetime.now(tz)
>>> d
datetime.datetime(2013, 8, 15, 20, 46, 4, 705896, tzinfo=<DstTzInfo 'Asia/Tehran' IRDT+4:30:00 DST>)
>>> d.utcoffset()
datetime.timedelta(0, 16200)

您将获得以 IRDT 表示的日期时间,因为当前夏令时在该时区有效。

于 2013-08-15T16:20:24.307 回答