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