Почему неправильное смещение pytz? - PullRequest
1 голос
/ 07 сентября 2011

У меня есть приложение на 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? Чего мне не хватает?

1 Ответ

2 голосов
/ 16 сентября 2011

Использование 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
...