Python неправильное преобразование часового пояса с помощью Pytz - PullRequest
2 голосов
/ 23 февраля 2011

Я написал следующий скрипт на python для преобразования даты и времени из любого заданного часового пояса в EST.

from datetime import datetime, timedelta  
from pytz import timezone  
import pytz  
utc = pytz.utc  

# Converts char representation of int to numeric representation '121'->121, '-1729'->-1729 
def toInt(ch):  
    ret = 0  
    minus = False  
    if ch[0] == '-':  
        ch = ch[1:]  
        minus = True  
    for c in ch:  
        ret = ret*10 + ord(c) - 48  
    if minus:  
        ret *= -1  
    return ret  

# Converts given datetime in tzone to EST. dt = 'yyyymmdd' and tm = 'hh:mm:ss' 
def convert2EST(dt, tm, tzone): 
    y = toInt(dt[0:4]) 
    m = toInt(dt[4:6]) 
    d = toInt(dt[6:8]) 
    hh = toInt(tm[0:2]) 
    mm = toInt(tm[3:5]) 
    ss = toInt(tm[6:8])

    # EST timezone and given timezone 
    est_tz = timezone('US/Eastern') 
    given_tz = timezone(tzone)

    fmt = '%Y-%m-%d %H:%M:%S %Z%z'

    # Initialize given datetime and convert it to local/given timezone 
    local = datetime(y, m, d, hh, mm, ss) 
    local_dt = given_tz.localize(local)


    est_dt = est_tz.normalize(local_dt.astimezone(est_tz)) 
    dt = est_dt.strftime(fmt) 
    print dt 
    return dt  

Когда я вызываю этот метод с convert2EST ('20110220', '11: 00: 00 ','America / Sao_Paulo ')

вывод «2011-02-20 08:00:00 EST-0500», но DST в Бразилии закончился 20 февраля, и правильный ответ должен быть «2011-02-20 09:00: 00 EST-0500 '.

Из некоторых экспериментов я выяснил, что согласно pytz DST в Бразилии заканчивается 27 февраля, что неверно.

Содержит ли pytz неверные данные или я что-то упускаю.Любая помощь или комментарии будут высоко оценены.

Ответы [ 2 ]

8 голосов
/ 23 февраля 2011

Во-первых, чуть менее безумная реализация:

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 года, он использовал (обновленные) данные из моей ОС.

2 голосов
/ 23 февраля 2011

Похоже, вы ответили на свой вопрос.Если pytz говорит, что DST заканчивается 27 февраля в Бразилии, это неправильно.Летнее время в Бразилии заканчивается в третье воскресенье февраля , если только это воскресенье не наступит во время карнавала;в этом году это не так, поэтому летнее время не задерживается.

Тем не менее, вы, похоже, без необходимости запускаете свой конвертер.Обратите внимание на модуль time, который, среди прочего, упрощает преобразование между gmt и местным временем.

...