2011-02-23 2 views
2

python으로 datetime을 주어진 시간대에서 EST로 변환하는 다음 스크립트를 작성했습니다. 제가 convert2EST이 메소드를 호출 할 때python을 사용하는 Python의 잘못된 시간대 변환

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 

는 ('20110220', '11 : 00 : 00 ','아메리카/상파울루 ') 2011-02-20 8시

출력은' 00 EST-0500 '이지만 브라질의 DST는 2 월 20 일에 끝났으며 정답은'2011-02-20 09:00:00 EST-0500 '이어야합니다.

일부 실험에서 필자는 브라질의 DST가 pythz에 따르면 2 월 27 일에 끝난다는 사실을 알아 냈습니다.

pytz에 잘못된 데이터가 포함되어 있거나 누락되었습니다. 어떤 도움이나 의견을 주시면 감사하겠습니다.

+3

문자열을 int로 변환하려면 내장 된 int 함수를 사용해야합니다. – sdolan

+0

및 strptime을 사용하여 날짜로 변환하십시오. –

답변

8

첫째로 약간 덜 미친 구현 :

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 오류가 아닙니다. 운영 체제를 업데이트해야 할 수도 있습니다. 이것은 (나는) 2005 년부터 pytz로 올바른 답을 얻은 이유라고 생각합니다. 그것은 내 OS의 (업데이트 된) 데이터를 사용했습니다.

+0

문서에 따르면 pytz는 OS 시간대가 아닌 Olson 시간대 데이터베이스를 사용합니다. 그것은 pytz의 최신 버전으로 업그레이드하는 문제 일 수 있습니다. http://pytz.sourceforge.net/#latest-versions –

+0

@ 마크 랜섬 (Mack Ransom) : 유닉스의 모든 버전 (모든 리눅스 버전 포함), OS X, * 역시 올슨 데이터베이스를 사용합니다. 내가 pytz 소스를 읽은 지 어느 정도 시간이 지났지 만, 나는 포함 된 것 대신에 상황에 따라 OS 데이터베이스를 사용하는 모호한 기억이있다. 그가 8 살짜리 피츠 (pytz) 버전을 사용하지 않는다면 그것은 거의 유일한 가능성입니다. –

+0

당신은 절대적으로 맞습니다! 나는 pytz의 이전 버전을 설치하고 업데이트하여 문제를 해결했습니다. 감사합니다 Lennart – user629424

2

자신 만의 질문에 답변 해 주셨습니다. pytz가 DST가 브라질에서 2 월 27 일에 종료된다고 말하면 그것은 잘못입니다. 브라질의 DST는 third Sunday of February으로 끝나지 만, 그 일요일은 카니발 기간 동안 하락하지 않습니다. 올해는 아니기 때문에 DST가 지연되지 않습니다.

그건 그렇고, 당신은 자신의 변환기를 불필요하게 압연하고있는 것처럼 보입니다. time 모듈을 살펴 봐야하는데 이는 gmt와 현지 시간 간의 전환을 용이하게합니다.