2017-05-12 9 views
-3

私はPythonでこれを行う簡単な方法が見つからないことに本当に驚いていました。我々は12月にこれを書いた。それは冬だったので、通り過ぎた。夏時間のPythonを含むUS/Easternから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) 

これはあなたの時間がUTCになるまでに5時間かかる。東部時間は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 

、自由が失礼増加する指数関数的に

関連する問題