PytzUsageWarning:zone 属性是特定于 pytz 的接口的;请迁移到新的时区提供商

Posted

技术标签:

【中文标题】PytzUsageWarning:zone 属性是特定于 pytz 的接口的;请迁移到新的时区提供商【英文标题】:PytzUsageWarning: The zone attribute is specific to pytz's interface; please migrate to a new time zone provider 【发布时间】:2021-12-14 23:21:59 【问题描述】:

我正在编写一个简单的函数,它使用 Asyncioscheduler 根据计划发送消息。

scheduler = AsyncIOScheduler()
scheduler.add_job(job, "cron", day_of_week="mon-fri", hour = "16")
scheduler.start()

它似乎有效,但我总是收到以下消息:

PytzUsageWarning: The zone attribute is specific to pytz's interface; please migrate to a new time zone provider. For more details on how to do so, see https://pytz-deprecation-shim.readthedocs.io/en/latest/migration.html
PytzUsageWarning: The localize method is no longer necessary, as this time zone supports the fold attribute (PEP 495)

我根本不熟悉 python 中的时间,所以我不确定这条消息要求我做什么。我访问了消息中提供的链接,但那里的解释对我来说太复杂了。据我了解,我必须迁移到使用 PEP495,但我究竟该怎么做呢?

【问题讨论】:

【参考方案1】:

要在 APScheduler 中设置 PIP495 兼容时区,请在实例化调度程序时设置参数:

scheduler = AsyncIOScheduler(timezone="Europe/Berlin")
scheduler.add_job(job, "cron", day_of_week="mon-fri", hour = "16")
scheduler.start()

使用flask-APScheduler(版本1.12.2),将时区添加到配置类中:

"""Basic Flask Example from flask-apscheduler examples, file jobs.py"""
from flask import Flask
from flask_apscheduler import APScheduler


class Config:
    """App configuration."""
    JOBS = [
        
            "id": "job1",
            "func": "jobs:job1",
            "args": (1, 2),
            "trigger": "interval",
            "seconds": 10,
        
    ]
    SCHEDULER_API_ENABLED = True
    SCHEDULER_TIMEZONE = "Europe/Berlin"  # <========== add here


def job1(var_one, var_two):
    print(str(var_one) + " " + str(var_two))


if __name__ == "__main__":
    app = Flask(__name__)
    app.config.from_object(Config())

    scheduler = APScheduler()
    scheduler.init_app(app)
    scheduler.start()

    app.run()

【讨论】:

对我来说,我需要将 timezone 添加到 IntervalTrigger,而不是调度程序(我正在使用 BackgroundScheduler)以使警告静音 非常感谢。使用 pyrogram 和作品 :) 没问题,我删掉之前的 @Sergo055,如果答案解决了你的问题,请接受,所以它被关闭了。【参考方案2】:

目前,您无法有效抑制这些警告,因为问题来自apscheduler 本身。

在您的特定情况下,警告来自here

if obj.zone == 'local':

问题是pytz 被认为已弃用,取而代之的是zoneinfo 模块及其后向端口。因此,即使您按照之前的建议直接设置 timezone 参数,您也可能会面临来自其他地方的相同警告,直到 apsheduler 修复现代 Python 版本的 pytz 用法。

但实际上,您可以做一些事情,但我不确定您是否可以接受这种修复。

PytzUsageWarning 来自pytz_deprecation_shim 包,它是tzlocal 的依赖包。 tzlocalpytz 深度集成。由于apschedulertzlocal 的依赖相对宽松,您可以安装相当旧的版本,它没有这样的警告,但对于apsscheduler 本身仍然可以接受。

pip install tzlocal==2.1

但是,请注意它可能会破坏其他项目的依赖关系,所以要小心。

【讨论】:

非常感谢!实际上,在启动调度程序时设置时区参数后,警告确实被抑制了。【参考方案3】:

由于该区域,我收到了相同的警告消息。

我所做的是:

import tzlocal

scheduler = AsyncIOScheduler(timezone=str(tzlocal.get_localzone()))

使用该本地时区,我不再收到警告消息并且它运行正常。

【讨论】:

以上是关于PytzUsageWarning:zone 属性是特定于 pytz 的接口的;请迁移到新的时区提供商的主要内容,如果未能解决你的问题,请参考以下文章

什么是“Zone.Identifier”文件? [关闭]

获取json串里的某个属性值

Oracle Database 12c Attribute Cluster 和 Zone Map 高阶实验

Oracle Database 12c Attribute Cluster 和 Zone Map 高阶实验

在光纤交换机中划zone是啥意思啊?

nginx 的限制连接模块limit_zone与limit_req_zone