1

さまざまなタイムゾーンのユーザーにメールリマインダーを送信するPythonアプリケーションがあります。開始時刻は特定の日時に設定され、リマインダーは開始時刻の数分前に設定される場合があります。

以前の開発者はユーザーのタイムゾーンを考慮していなかったため、リマインダーは常にサーバーの時間に基づいて送信されていました。

pytzのドキュメントを使用して、最初はすべてにUTCを使用してみましたが、これは開発では機能していましたが、本番環境ではリマインダーがオフのままでした。最初は、これはサーバー上のNTPの問題だと思いましたが、そうではありませんでした。

開発と本番の動作が実際に異なることを確認したかったので、2つの間でテストするための簡単なスクリプトを作成しました。

server_time = datetime.datetime.utcnow()
print "Server Time:", server_time

user_timezone = pytz.timezone('America/Montevideo')
print "User Timezone:", user_timezone

user_offset = user_timezone.utcoffset(server_time)
print "Offset:", user_offset

user_datetime = server_time + user_offset
print "User Time:", user_datetime

開発の結果(正しい):

Server Time: 2011-09-07 16:53:00.711334
User Timezone: America/Montevideo
Offset: -1 day, 21:00:00
User Time: 2011-09-07 13:53:00.71133

生産の結果(正しくない):

Server Time: 2011-09-07 16:53:01.767143
User Timezone: America/Montevideo
Offset: -1 day, 20:15:00
User Time: 2011-09-07 13:08:01.767143

したがって、pytzが単に間違ったオフセットを与えているように見えます。別のタイムゾーンを使用してもかまいません。私が試したものはすべて間違ったオフセットを与えます。

環境の違いはどちらもUbuntuボックスですが、本番はPython 2.5.2を実行しており、開発は2.6.2です。

pytzについて報告されたバグはそれほど多くなく、どの検索でもオフセットが異なる理由は見つかりませんでした。

それで、これは私の本番サーバー上のpytzデータの問題ですか?ピッツバグ?または、pytzの理解に問題がありますか?私は何が欠けていますか?

4

1 に答える 1

2

pytz2010バージョンを使用

$ python test.py 
Server Time: 2011-09-16 00:20:49.479426
User Timezone: America/Montevideo
**Offset: -1 day, 20:15:00** wrong!
User Time: 2011-09-15 20:35:49.479426-03:00

pytz2011バージョンを使用

$ python test.py 
Server Time: 2011-09-16 00:36:54.764812
User Timezone: America/Montevideo
**Offset: -1 day, 21:00:00** great!
User Time: 2011-09-15 21:36:54.764812

pytz.VERSIONを見て、少なくとも2011hを使用していることを確認してください

>>> import pytz
>>> pytz.VERSION
'2011h'

2010をお持ちの場合は、以下を削除して交換してください。

>>> pytz.__file__
/usr/lib/python2.6/dist-packages/pytz/__init__.pyc

$ sudo rm -r /usr/lib/python2.6/dist-packages/pytz*
$ sudo pip install pytz == 2011h
于 2011-09-15T23:59:09.283 に答える