2017-05-12 86 views
-3

我真的很驚訝沒有找到一個簡單的方法來做到這一點在Python中。我們在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 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)) 

你怎麼能EST轉換爲UTC,將工作,全年?自從夏令時每年發生變化以來,我不想對其進行硬編碼。謝謝

+0

爲什麼你認爲冬天的日期應該只有4個小時不同?你是否想要將當前的時區差異(使用DST)應用於另一個不在DST中的日期?這沒有什麼意義。 –

+0

不,冬天的日子有5個小時不同......夏天/春天/初秋的日子是4個小時。我會發布解決方案 – codyc4321

+0

但是您的測試日期是2月份的冬季日期,並且您正在測試以查看是否有4小時不同(4:38與8:38)。 –

回答

0

上的答案發現這一點:

def is_daylight_savings(timezone_name): 
    tz = pytz.timezone(timezone_name) 
    now = pytz.utc.localize(datetime.utcnow()) 
    return now.astimezone(tz).dst() != timedelta(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

相關問題