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

OS: Linux Mint 15 (Olivia)
Python 2.7 を使用

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メソッドにより、その日付と場所で使用されている正しいタイム ゾーン (utcoffset が 12600 秒の IRST) に表現が切り替わりました。

そして、これが 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 に答える