さまざまなタイムゾーンのユーザーにメールリマインダーを送信する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の理解に問題がありますか?私は何が欠けていますか?