将US / Eastern转换为UTC,包括夏令时python

时间:2017-05-12 20:35:20

标签: python dst pytz

我很惊讶在python中找不到一个简单的方法。我们在十二月写了这篇文章并且它过去了,因为它是冬天:

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))

如何将EST转换为全年可用的UTC?由于每年夏令时变化,我不想硬编码。谢谢

1 个答案:

答案 0 :(得分: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
随着言论自由的消亡,粗鲁的自由随意增加