Почему смещение pytz неверно?

У меня есть приложение python, которое отправляет напоминания по электронной почте пользователям в разных часовых поясах. Время начала устанавливается на заданную дату и время, а напоминание может быть установлено на некоторое количество минут до времени начала.

Предыдущий разработчик не учитывал часовой пояс пользователя, поэтому напоминания всегда отправлялись в зависимости от времени сервера.

Используя документацию pytz, я изначально пытался использовать UTC для всего, и хотя это работало в процессе разработки, напоминания по-прежнему снято с производства. Сначала я предполагал, что это проблема с NTP на сервере, но это оказалось не так.

Я хотел убедиться, что разработка и производство действительно ведут себя по-разному, поэтому я создал простой скрипт для тестирования между ними:

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? Или проблема с моим пониманием pytz? Что я упускаю?


person bogeymin    schedule 07.09.2011    source источник
comment
Вы используете сервер на базе Debian? Посмотрите на различия между /usr/share/zoneinfo/America/Montevideo на вашем сервере разработки и рабочем сервере.   -  person Mario César    schedule 16.09.2011


Ответы (1)


Использование версии pytz 2010

$ 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

Использование версии pytz 2011

$ 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
person Mario César    schedule 15.09.2011
comment
Хорошая работа. Смещение теперь правильное. Серийная версия была 2009a. На сервере не было pip, и хотя easy_install жаловался на == 2011h, он установил пакет. Я пытался обновить pytz, НО я сделал это вручную, а не с помощью easy_install. Очевидно, что последняя версия pytz не работает с python 2.5, и я не знал, что все, что мне нужно было сделать для обновления, это удалить старую версию и позволить easy_install предоставить последний доступный пакет для моей версии python. Опять же, хорошая работа. Спасибо! Теперь вернемся к интеграции... - person bogeymin; 20.09.2011