我试图每天早上 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 小时,但这不起作用。
寻找在任何服务器/任何时区运行python代码的最佳方法,但调度程序将在该时区的时区('亚洲/加尔各答')中触发。
有没有办法在线程级别或完整的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方式。
如果您正在寻找支持时区的调度程序,您可能会对 调度程序库感兴趣。您所描述的类似情况的示例可以在文档中找到。我在下面对其进行了修改以满足您的问题,并另外添加了第二个具有独立时区的作业,以便更好地演示。
披露:我是调度程序库的作者之一
设置您的服务器和作业时区并创建有效负载函数。
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
我不确定我是否理解你的第二个问题,但总是可以将一个具有时区的
datetime.datetime
对象转换为另一个具有另一个时区的 datetime.datetime
对象。例如。你可以这样做:
now_cest = dt.datetime.now(TZ_CEST)
now_ist = now_cest.astimezone(TZ_IST)