python - `pytz.localize()` 四舍五入到最接近的现有小时(在 DST 跳跃的情况下)
问题描述
基本上,我得到了:
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 年 3 月 10 日的日期时间和美国/东部时区。
我想使用 03:00(实际上是 DST 飞跃后的时间)构建特定日期时间和时区中的时间戳,而不是在我将时间戳与日期时间结合并对其进行本地化时将变为无效的任何挂起时间。这样做是为了自动将一些与挂钟时间相关的约会列表复制到另一天。
解决方案
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)
似乎工作。
推荐阅读
- javascript - ReferenceError: Socket is not defined .....使用 Socket.io 创建节点服务器时
- c# - WPF DataGrid - 使用 DataTable 作为 ItemsSource 的自定义排序
- java - 无法传输状态码为 409 maven 的文件
- c - printf 不能在带有指向结构的指针的函数之外工作
- django - Django 'GET' 请求错误 500 strict-origin-when-cross-origin
- jenkins - 如何使用 Jenkins CLI 传递复选框参数
- elasticsearch - ElasticSearch - 我如何对查询结果应用过滤器以限制具有特定值的文档
- flutter - 具有嵌套/反应模型/反应形式的颤振形式
- c# - 有没有办法提取 Lotus Notes 富文本字段以保持格式?
- java - grpc v1.34.1 的客户端负载平衡,nameResolverFactory 已弃用