我想在埃里温时间 08:00 执行该函数,但默认情况下它将在当地时间 08:00 执行,具体取决于服务器的位置。将来,我的服务器将多次移动到世界不同的地方,因此我需要配置所有内容,以便该功能在埃里温时间 08:00 准确执行
if __name__ == "__main__":
schedule.every().day.at('08:00').do(function_to_run)
Thread(target=schedule_checker).start()
我尝试过使用不同的库,例如 pytz,但每次我都遇到需要指定原始时区的情况。也就是说,它看起来像:“明确定义的时区 1”>“明确定义的时区 2”。但我需要这样的:“本地时区”>“明确定义的时区”
可以使用
pytz
库来实现此目的,它允许使用
timezone
方法指定时区。 以下是如何操作的方法:
import pytz
import datetime
import schedule
import time
from threading import Thread
def function_to_run():
print("函数在埃里温时间 08:00 执行!")
def schedule_checker():
while True:
schedule.run_pending()
time.sleep(1)
if __name__ == "__main__":
# 设置 Yerevan 时区
yerevan_tz = pytz.timezone('Asia/Yerevan')
# 获取当前时间并将其转换为 Yerevan 时间
now = datetime.datetime.now(pytz.utc)
yerevan_time = now.astimezone(yerevan_tz)
# 创建一个 Yerevan 时间的 datetime 对象,时间为 08:00
target_time = yerevan_tz.localize(datetime.datetime.combine(yerevan_time.date(), datetime.time(8, 0)))
# 如果 target_time 已经过去了,则将其设置为明天的 08:00
if target_time < now.astimezone(yerevan_tz):
target_time += datetime.timedelta(days=1)
# 计算距离 target_time 的秒数
seconds_to_wait = (target_time - now.astimezone(yerevan_tz)).total_seconds()
# 使用 seconds_to_wait 来延迟第一次执行
time.sleep(seconds_to_wait)
function_to_run()
# 之后每天在 Yerevan 时间 08:00 执行
schedule.every().day.at('08:00').do(function_to_run)
Thread(target=schedule_checker).start()
代码解释:
-
导入必要的库:
pytz
用于处理时区,datetime
用于处理日期和时间。 -
设置 Yerevan 时区:
使用
pytz.timezone('Asia/Yerevan')
获取 Yerevan 时区。 - 获取当前时间并转换为 Yerevan 时间:
-
使用
datetime.datetime.now(pytz.utc)
获取当前 UTC 时间。 -
使用
.astimezone(yerevan_tz)
将其转换为 Yerevan 时间。 -
创建目标时间:
使用
yerevan_tz.localize()
将 Yerevan 时间 08:00 转换为 Yerevan 时区的 datetime 对象。 - 处理已过去的时间: 如果目标时间在当前时间之前,则将其设置为明天的 08:00。
- 计算延迟时间: 计算当前时间和目标时间之间的秒数差。
-
延迟第一次执行:
使用
time.sleep()
延迟第一次执行,直到 Yerevan 时间 08:00。 -
设置每日计划任务:
使用
schedule
库设置每天在 Yerevan 时间 08:00 执行function_to_run
。 - 启动计划任务线程: 启动一个新线程来运行计划任务,确保主线程不会阻塞。
这样,的代码将在 Yerevan 时间 08:00 准确执行,而无需显式指定原始时区。 无论服务器位于何处,此方法都有效,因为它依赖于 UTC 时间和 Yerevan 时区之间的转换。
标签:python,timezone,schedule From: 78798201