`pytz.localize()`用于舍入到最接近的现有小时(在DST跳跃的情况下)

问题描述 投票:0回答:1

基本上,我得到了:

tz = pytz.timezone('US/Eastern')
dt = datetime.datetime(2019, 03, 10, 02, 30)

我想将dt本地化到时区,同时删除不存在的小时。

如果我做tz.normalize(tz.localize(dt)),我会得到

datetime.datetime(2019, 3, 10, 3, 30, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)

我想要

datetime.datetime(2019, 3, 10, 3, 00, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)

(使用03:00代替03:30,因为它接近02:30壁钟)。

用例:我得到了一个壁挂时间列表(其中一个恰好是02:30),日期时间为2019-03-10,时区为US / Eastern。

我想使用03:00(实际上是DST跳跃之后的时间)构建特定日期时间和时区的时间戳,而不是当我将时间戳与日期时间结合并将其本地化时将变为无效的任何挂壁时间。这样做是为了自动将一些与挂钟时间相关的约会列表复制到另一天。

python pytz
1个回答
0
投票
def localize_and_round_datetime(dt, tz):
    """
    Similar to tz.normalize(tz.localize(dt)), but rounds any time in non-existing hour to the time right after it.
    """
    result = tz.normalize(tz.localize(dt))
    if result.replace(tzinfo=None) == dt:
        return result

    # DT belongs to the leap hour. find the datetime right after leap
    # see: DstTzInfo.localize()
    tzinfo_dst_idx = bisect_right(tz._utc_transition_times, dt)
    new_tz = tz._utc_transition_times[tzinfo_dst_idx]
    return pytz.UTC.localize(new_tz).astimezone(tz)

似乎工作。

© www.soinside.com 2019 - 2024. All rights reserved.