Во-первых, чуть менее безумная реализация:
import datetime
import pytz
EST = pytz.timezone('US/Eastern')
def convert2EST(date, time, tzone):
dt = datetime.datetime.strptime(date+time, '%Y%m%d%H:%M:%S')
tz = pytz.timezone(tzone)
dt = tz.localize(dt)
return dt.astimezone(EST)
Теперь мы попробуем назвать это:
>>> print convert2EST('20110220', '11:00:00', 'America/Sao_Paulo')
2011-02-20 09:00:00-05:00
Как мы видим, мы получаем правильный ответ.
Обновление: я понял!
Бразилия изменила летнее время в 2008 году. Неясно, что было до этого, но, вероятно, ваши данные устарели.
Вероятно, это не ошибка pytz, так как pytz может использовать базу данных вашей операционной системы. Возможно, вам нужно обновить операционную систему. Это (я думаю) причина, по которой я получил правильный ответ даже с pytz 2005 года, он использовал (обновленные) данные из моей ОС.