python调度程序从任何时区调度特定时区的作业

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

我试图每天早上 8:00 在时区('亚洲/加尔各答')运行一项工作,所以我开始使用 python 时间表。这是一个示例片段:

import schedule
import time

def job(t):
    print "I'm working...", t
    return

schedule.every().day.at("08:00").do(job,'It is 08:00')

while True:
    schedule.run_pending()
    time.sleep(30) # wait one minute

如果在印度服务器中执行,此代码片段效果很好,但如果我在 COLAB 或 AWS(位于不同时区)中运行,则作业将根据该特定时区在上午 8:00 开始。我想让代码在这个时区(“亚洲/加尔各答”)每天上午 8:00 运行,无论服务器时区如何。我浏览了 Stack Overflow 上与时区相关的不同文章,获取偏移量并将上午 8:00 更改为 8:00 + 一些偏移量 4:30 小时,但这不起作用。

  1. 寻找在任何服务器/任何时区运行python代码的最佳方法,但调度程序将在该时区的时区('亚洲/加尔各答')中触发。

  2. 有没有办法在线程级别或完整的Python进程级别更改日期时间时区(仅适用于该脚本/线程,而不是系统级别),所以我想在Python中更改一次时区,然后无论我在哪里调用datetime.now (),它应该按照新时区给出时间,

       eastern = timezone('Asia/Calcutta')
       # naive datetime
       naive_dt = datetime.now()
       # localized datetime
       loc_dt = datetime.now(eastern)
       print(naive_dt.strftime(fmt))
    
       print(loc_dt.strftime(fmt))
    

基于此(answer)我对更改系统文件不感兴趣,我正在寻找一种Pythonic方式。

python python-3.x datetime timezone scheduler
1个回答
3
投票

如果您正在寻找支持时区的调度程序,您可能会对 调度程序库感兴趣。您所描述的类似情况的示例可以在文档中找到。我在下面对其进行了修改以满足您的问题,并另外添加了第二个具有独立时区的作业,以便更好地演示。

披露:我是调度程序库的作者之一

问题1

设置您的服务器和作业时区并创建有效负载函数。

import datetime as dt
import time
from scheduler import Scheduler
import pytz 

TZ_SERVER = dt.timezone.utc  # can be any valid timezone

TZ_IST = pytz.timezone('Asia/Calcutta')  # IST - India Standard Time
TZ_CEST = pytz.timezone('Europe/Berlin')  # CEST - Central European Summer Time

def task(tzinfo):
    current_time = dt.datetime.now(tzinfo)
    print(f"I'm working... {current_time!s}")

创建 Scheduler 实例并安排具有指定时间和时区的每日重复作业:

schedule = Scheduler(tzinfo=TZ_SERVER)

trigger_ist = dt.time(hour=8, tzinfo=TZ_IST)
schedule.daily(trigger_ist, task, args=(TZ_IST,))

trigger_cest = dt.time(hour=8, tzinfo=TZ_CEST)
job_cest = schedule.daily(trigger_cest, task, args=(TZ_CEST,))

显示日程安排的简单概述。

print(schedule)
max_exec=inf, tzinfo=UTC, priority_function=linear_priority_function, #jobs=2

type     function         due at              tzinfo          due in      attempts weight
-------- ---------------- ------------------- ------------ --------- ------------- ------
DAILY    task(..)         2021-07-20 08:00:00 IST            2:36:42         0/inf      1
DAILY    task(..)         2021-07-20 08:00:00 CEST           6:06:42         0/inf      1

创建类似于调度库的执行循环:

while True:
    schedule.exec_jobs()
    time.sleep(60)  # wait one minute

调用有效负载函数后,您应该看到类似于下面的内容。

I'm working... 2021-07-20 08:00:33.173469+05:30

问题2

我不确定我是否理解你的第二个问题,但总是可以将一个具有时区的

datetime.datetime
对象转换为另一个具有另一个时区的
datetime.datetime
对象。例如。你可以这样做:

now_cest = dt.datetime.now(TZ_CEST)
now_ist = now_cest.astimezone(TZ_IST)
© www.soinside.com 2019 - 2024. All rights reserved.