2017-05-12 11 views
-3

나는 파이썬에서이 작업을 수행하는 쉬운 방법을 찾지 못한 것에 대해 놀랐다. 우리는 12 월에이 편지를 썼습니다. 겨울 이었기 때문에 통과했습니다 :미국/동부 표준시로 UTC (일광 절약 시간제 포함)로 변환

def get_utc_time(dt_or_str, number_of_days=None, time_format=DATETIME_FORMAT): 
    """ 

    :param dt_or_str: 
    :return: 
    """ 
    eastern = pytz.timezone('US/Eastern') 

    # try: 
    if isinstance(dt_or_str, datetime): 
     new_date_str = dt_or_str.strftime(time_format) 
     new_date_obj = dt_or_str 
    else: 
     new_date_str = dt_or_str 
     new_date_obj = datetime.strptime(dt_or_str, time_format) 

    if not number_of_days: 
     utc_time = eastern.localize(
      datetime.strptime(new_date_str, time_format), 
      is_dst=None).astimezone(pytz.utc) 
    else: 
     est_time = new_date_obj - timedelta(days=number_of_days) 
     utc_time = eastern.localize(est_time, is_dst=None).astimezone(pytz.utc) 

    utc_time = utc_time.replace(tzinfo=None) 

이것은 5 시간의 UTC 시간을 더한 것입니다. 봄/여름 동부 시간은 UTC보다 불과 4 시간 늦어서 코드가 깨졌습니다.

이 우리가 여름에 작동하지 않습니다 쓴 테스트 :

def test_get_utc_time_incoming_string(self): 
    result = get_utc_time("2017-02-02 04:38") 
    self.assertEqual(result, datetime.datetime(2017, 2, 2, 8, 38)) 

어떻게 당신은 일년 내내 작동 UTC에 EST 변환 할 수 있습니까? 일광 절약 기간이 매년 바뀌기 때문에 하드 코드를 작성하고 싶지 않습니다. 이 지금은 너무

def is_daylight_savings(timezone_name): 
    tz = pytz.timezone(timezone_name) 
    now = pytz.utc.localize(datetime.utcnow()) 
    return now.astimezone(tz).dst() != timedelta(0) 

: : 감사합니다

+0

은 왜 그렇게 생각하십니까 겨울날 날짜는 4 시간 만 달라야합니까? 오늘의 표준 시간대 차이 (DST 사용)를 DST에없는 다른 날짜에 적용한다고 말하고 있습니까? 그건별로 의미가 없습니다. –

+0

아니요, 겨울철 날짜는 5 시간 달라 ... 여름/봄/초가을 날짜는 4 시간입니다. 솔루션을 게시 할게요 – codyc4321

+0

테스트 날짜는 2 월의 겨울 날짜이며 4 시간 차이인지 테스트하고 있습니다 (4:38 대 8:38). –

답변

0

이 답변에 발견 언론의 자유가 죽으면

def get_utc_time(dt_or_str, number_of_days=None, time_format=DATETIME_FORMAT): 
    """ 
    :param dt_or_str: 
    :return: 
    """ 
    eastern = pytz.timezone(TIMEZONE) 
    it_is_daylight_savings = is_daylight_savings(TIMEZONE) 

    if isinstance(dt_or_str, datetime): 
     new_date_str = dt_or_str.strftime(time_format) 
     new_date_obj = dt_or_str 
    else: 
     new_date_str = dt_or_str 
     new_date_obj = datetime.strptime(dt_or_str, time_format) 

    if not number_of_days: 
     utc_time = eastern.localize(
      datetime.strptime(new_date_str, time_format), 
      is_dst=it_is_daylight_savings).astimezone(pytz.utc) 
    else: 
     est_time = new_date_obj - timedelta(days=number_of_days) 
     utc_time = eastern.localize(est_time, is_dst=it_is_daylight_savings).astimezone(pytz.utc) 

    utc_time = utc_time.replace(tzinfo=None) 

    return utc_time 

, 자유 무례 증가로 exponentionally