有没有办法在 Python 中推断日期是否是 DST(夏令时)更改的实际日期?

2024-01-31

我想在Python中推断日期是否是一年中由于DST(夏令时)而改变小时的实际日期。

与图书馆pytz您可以本地化日期时间,并且实际的 DST 更改已正确完成。此外,还有一个方法dst()图书馆的datetime这使您可以推断实际日期是夏季还是冬季(example https://stackoverflow.com/questions/31146092/how-to-determine-if-a-timezone-specific-date-in-the-past-is-daylight-saving-or-n)。但是,我想推断 DST 更改的实际日期。

具体来说,我需要一个函数(例如is_dst_change(date, timezone)) 接收日期并仅对于一年中确实存在小时变化的那些日子返回 True。例如:

import pytz
import datetime

def is_dst_change(day, timezone):
    # Localize
    loc_day = pytz.timezone(timezone).localize(day)

    # Pseudocode: Infer if a date is the actual day in which the dst hour change is made
    if loc_day is dst_change_day:
        return True
    else:
        return False

# In the timezone 'Europe/Madrid', the days in which the DST change is made in 2021 are 28/03/2021 and 31/10/2021
is_dst_change(day=datetime.datetime(year=2021, month=3, day=28), timezone = 'Europe/Madrid')  # This should return True
is_dst_change(day=datetime.datetime(year=2021, month=10, day=31), timezone = 'Europe/Madrid')  # This should return True
is_dst_change(day=datetime.datetime(year=2021, month=2, day=1), timezone = 'Europe/Madrid')  # This should return False
is_dst_change(day=datetime.datetime(year=2021, month=7, day=1), timezone = 'Europe/Madrid')  # This should return False

因此,在上面的示例中,函数仅在 2021 年中使用is_dst_change(day, timezone='Europe/Madrid')将返回True分别是 2021 年 3 月 28 日和 2021 年 10 月 31 日。 2021 年剩下的日子里,它必须返回False。有没有办法用Python来推断这一点?


您可以利用日期时间.dst() https://docs.python.org/3/library/datetime.html#datetime.datetime.dst(UTC 偏移量的变化不一定是 DST 转换):

from datetime import datetime, time, timedelta
from zoneinfo import ZoneInfo # Python 3.9+

def is_date_of_DSTtransition(dt: datetime, zone: str) -> bool:
    """
    check if the date part of a datetime object falls on the date
    of a DST transition.
    """
    _d = datetime.combine(dt.date(), time.min).replace(tzinfo=ZoneInfo(zone))
    return _d.dst() != (_d+timedelta(1)).dst()

例如对于 tz欧洲/柏林 https://www.timeanddate.com/time/change/@2950159:

for d in range(366):
    if is_date_of_DSTtransition(datetime(2021, 1, 1) + timedelta(d), "Europe/Berlin"):
        print((datetime(2021, 1, 1) + timedelta(d)).date())
# 2021-03-28
# 2021-10-31

注意:我正在使用zoneinfo https://docs.python.org/3/library/zoneinfo.html在这里而不是pytz;对于遗留代码,有一个pytz 弃用垫片 https://pypi.org/project/pytz-deprecation-shim/。这是一个pytz无论如何版本(需要额外的normalize):

import pytz
def is_date_of_DSTtransition(dt: datetime, zone: str) -> bool:
    _d = pytz.timezone(zone).localize(datetime.combine(dt.date(), time.min))
    return _d.dst() != pytz.timezone(zone).normalize(_d+timedelta(1)).dst()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法在 Python 中推断日期是否是 DST(夏令时)更改的实际日期? 的相关文章

随机推荐

  • 为什么使用 std::make_* 而不是构造函数更好?

    STL中有一些函数以make 前缀如std make pair std make shared std make unique等等 为什么使用它们而不是简单地使用构造函数是更好的做法 auto pair2 std pair lt int d
  • 添加 VPC 配置后调用 lambda 超时

    我正在使用无服务器框架来创建 lambda 我创建了一个简单的 Lambda 函数 它从 Mongo 实例进行查询并返回响应 最初 我使用 publicIp 创建了 Mongo 实例 并让 Lambda 使用 publicIP 访问该实例
  • 在 mysql 脚本中静默“Query OK 0 row受影响”输出

    我有一个创建多个存储过程的 MySQL 脚本 我想让大家沉默 Query OK 0 rows affected 0 00 sec 当我运行时出现的消息 source MY SCRIPT sql 它变成了一个很长的列表 我有时会忘记在开发过程
  • Visual Studio 2010 中的 Microsoft 图表控件?

    这可能吗 我安装了它们 但它们没有出现 我必须导入它们还是什么 如果在工具箱中看不到 Chart 控件 请右键单击工具箱 选择 选择项 然后在 NET Framework 组件 选项卡中选择以下命名空间 System Web UI Data
  • 设置带有子包的 python 包的正确方法

    我正在尝试在 python 中设置一个带有子包的包 这是我目前拥有的树结构 myPackage init py mySubPackage1 foo2 py foo py init py mySubPackage2 bar2 py bar p
  • Android SQLiteOpenHelper - 每个表都有不同的类?

    我正在读这篇文章 http www vogella com tutorials AndroidSQLite article html http www vogella com tutorials AndroidSQLite article
  • 像 TinyPNG 这样的图像优化 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我在 Google 上搜索过一个好的 Mass Image Optimizer 可以在 Windows
  • 如何从 Android 中的菜单项调用 Activity?

    我试图通过单击菜单按钮来调用 startActivity myIntent 但我的应用程序此时崩溃了 通过常规按钮单击 相同的 startActivity 调用可以正常工作 因此 我认为菜单按钮缺少有关上下文的信息 或者也许我在这里完全偏离
  • 将 jQueryUI 可排序列表与表单一起使用

    我正在使用 jQueryUI 创建一个可排序列表 并且 UI 部分工作得很好 因为我可以根据需要在网页上对项目进行排序 但我不知道排序列表的顺序是如何包含在 POST 中的 我对 javascript 完全是菜鸟 所以如果这真的很简单 请原
  • TimeSpan 转 ISO8601 持续时间格式字符串

    任何人都可以建议如何将时间跨度或整数转换为 ISO8601 持续时间字符串 如中所述http en wikipedia org wiki ISO 8601 Durations http en wikipedia org wiki ISO 8
  • WPF 验证器类似于 ASP.NET 中的验证器

    我们如何在 WPF 应用程序中实现类似于 ASP NET 应用程序的验证器 如必填字段验证器 提前致谢 None
  • 如何在 Cypress e2e 测试中使用 Angular Store

    我需要在我的 Angular Store 中注入一个值 调度一个操作 以使我的 Cypress e2e 测试正常工作 事实上 我需要我的商店包含 isLoggedIn true 来访问应用程序中的任何页面 否则用户将被重定向到登录页面 我在
  • 使用 visNetwork 动态更新 R 中的节点

    下面的快照视觉效果是使用 visNetwork 包创建的 我这里的要求是我必须对边缘进行硬编码 并且在使用 visHierarchicalLayout 之后 我无法按顺序看到它们 请帮助我采用动态方法 这样无论有多少个数字 我都会得到连续的
  • 查找字符串中某个字符的所有出现位置

    我试图找到所有出现的 在一个字符串中 def findSectionOffsets text startingPos 0 endPos len text for position in text find startingPos endPo
  • Eclipse 字体缩小和放大问题

    如何在 Eclipse 中放大和缩小文本 我找到了插件 但无法手动安装 请告诉我在 Eclipse 中安装不同插件的过程 我在使用 Android 开发工具 Eclipse 遇到很多问题后问了这个问题 查看此链接 您一定会喜欢它Eclips
  • 使用 PHP 整理多个 JavaScript 文件是否比单独包含它们更快?

    我知道提供多个小文件比提供一个大文件要慢得多 这就是为什么最好使用单个 CSS 文档和精灵表 一段时间以来 我还尝试在尽可能少的文件中包含尽可能多的 JavaScript 以避免查看者多次请求更多文件 但是在同一个文档中包含各种明显不同的任
  • Python 子进程因命名管道而挂起

    I m 挣扎在试图模仿这个简单的片段bash cat tmp fifo tub 1 24027 gunzip c tmp filedat dat gz gt tmp fifo tub line 01 line 02 line 03 line
  • 如何知道 python-docx 中的新段落何时导致新页面

    我必须使用动态创建Word文档python docx 我通过动态添加表行来实现这一点 并且无法知道页面上适合多少条记录 因为这取决于特定的数据 我需要知道添加到文档 表行或段落 的新元素何时会导致新页面 因此我可以根据每个页面包含的信息在数
  • 通过融合查看分支的差异?

    我知道我可以查看 HEAD 和当前状态之间的差异meld 但是我如何查看分支之间的差异 例如master and devel与融合 目前我执行以下步骤 重命名工作副本的文件夹例如mv projectA projectA master 再次克
  • 有没有办法在 Python 中推断日期是否是 DST(夏令时)更改的实际日期?

    我想在Python中推断日期是否是一年中由于DST 夏令时 而改变小时的实际日期 与图书馆pytz您可以本地化日期时间 并且实际的 DST 更改已正确完成 此外 还有一个方法dst 图书馆的datetime这使您可以推断实际日期是夏季还是冬