首页 > 编程问答 >如何将本地时区的时间转换为特定时区的时间?

如何将本地时区的时间转换为特定时区的时间?

时间:2024-07-29 13:58:50浏览次数:14  
标签:python timezone schedule

我想在埃里温时间 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()

代码解释:

  1. 导入必要的库: pytz 用于处理时区, datetime 用于处理日期和时间。
  2. 设置 Yerevan 时区: 使用 pytz.timezone('Asia/Yerevan') 获取 Yerevan 时区。
  3. 获取当前时间并转换为 Yerevan 时间:
  4. 使用 datetime.datetime.now(pytz.utc) 获取当前 UTC 时间。
  5. 使用 .astimezone(yerevan_tz) 将其转换为 Yerevan 时间。
  6. 创建目标时间: 使用 yerevan_tz.localize() 将 Yerevan 时间 08:00 转换为 Yerevan 时区的 datetime 对象。
  7. 处理已过去的时间: 如果目标时间在当前时间之前,则将其设置为明天的 08:00。
  8. 计算延迟时间: 计算当前时间和目标时间之间的秒数差。
  9. 延迟第一次执行: 使用 time.sleep() 延迟第一次执行,直到 Yerevan 时间 08:00。
  10. 设置每日计划任务: 使用 schedule 库设置每天在 Yerevan 时间 08:00 执行 function_to_run
  11. 启动计划任务线程: 启动一个新线程来运行计划任务,确保主线程不会阻塞。

这样,的代码将在 Yerevan 时间 08:00 准确执行,而无需显式指定原始时区。 无论服务器位于何处,此方法都有效,因为它依赖于 UTC 时间和 Yerevan 时区之间的转换。

标签:python,timezone,schedule
From: 78798201

相关文章

  • 从Python中的数据框中删除不必要的数据
    所以我这里有一个dat文件,我正在使用Python来读取它。在整个文件中,有一些不必要的行,例如BEGIN等,而我真正想开始阅读的部分是从数据帧开始。因此,我想检查在Python中执行此操作的最佳方法是什么,并且只阅读数据框何时开始?谢谢!以下是使用Python从数据......
  • Python拟合曲线
    拟合曲线多项式拟合np.ployfit(x,y,deg)importmatplotlib.pyplotaspltimportnumpyasnpx=[1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6,6.5,7,7.5,8]y=[33.40,79.50,122.65,159.05,189.15,214.15,238.65,252.2,267.55,280.50,296.65,301.65,310.......
  • 12个Python数据类型转换实战演练
    文末赠免费精品编程资料~~在Python编程中,数据类型转换是处理数据时必不可少的技能。掌握如何灵活地在不同类型之间转换,能让你的代码更加高效和灵活。下面,我们将通过一系列实战演练,学习并实践12种常见的Python数据类型转换。1.整数转字符串实战案例:将年龄转换为字符串......
  • Python全套教程,小白零基础入门必备!
    Python是一种语法简单、功能强大的编程语言,它注重的是如何高效解决问题。【教程领取方式在文末!!】正是这种简单实用的特性,让Python成为近年来最热门的编程语言之一。Python具有广泛的应用场景,包括:Web开发、数据分析、机器学习、网络爬虫、人工智能、量化交易等众多领......
  • BP神经网络及其Python和MATLAB实现预测
    BP神经网络及其Python和MATLAB实现预测引言BP神经网络(BackPropagationNeuralNetwork),即反向传播神经网络,是一种通过反向传播算法进行监督学习的多层前馈网络。这种网络能够通过不断地调整和改变神经元的连接权重,达到对特定任务的学习和优化。由于其高度的灵活性和适应性......
  • 为什么Python要对引用非容器类型的类型实现循环GC
    检查文档:支持循环垃圾收集Python对检测和收集涉及循环引用的垃圾的支持需要对象类型的支持,这些对象类型是其他对象的“容器”,这些对象也可能是容器不存储对其他对象的引用或仅存储对原子类型(例如数字或字符串)的引用的类型不需要为垃圾收集提供任何显......
  • 如何在 Visual Studio Code 中降级终端中的 python?
    我有一段代码需要运行,但它仅与tensorflow1.3、1.4和1.5兼容。我想我需要降级python才能运行它,但是终端有python3.10我尝试创建虚拟环境失败,但终端仍然说它正在使用python3.10,所以我仍然无法运行代码有什么我可以做的吗?是对的,创建虚拟环境是运行不同Python版本代......
  • python-小李帮老师改错(赛氪OJ)
    [题目描述]老师给小理发了一封电子邮件,任务如下。写一个程序,给你 n 个数,输出 X。X=num1p1​​+num2p2​​+⋯+numnpn​​。                 num1​,num2​,⋯⋯,numn​ 都是整数,p1​,p2​,⋯⋯pn​ 都是一位数。但是出现了一些玄学错误,......
  • 保护从 py2exe python 生成的二进制文件
    我的项目需要将我的python文件转换为py2exe。公平地说,我的py2exe正在工作。假设我的二进制文件名为“test.exe”。我知道我的test.exe包含我的python文件的所有pyc文件。我想要做的是,保护我的text.exe,这样我的源代码就不会被看到,换句话说,我不希望它被反编译回来,我该怎......
  • python 将数字前面的字符替换为数字后面的新字符
    我有一些字符串看起来像:*.rem.1.gz和*.rem.2.gz我想将其替换为*.1.trim.gz和*.2.trim.gz1号文件和2号文件相互配对,我想创建一个单独的字符串来同时包含这两个文件。importosallfiles=os.listdirpair=[x.replace("rem.(\d+)","(\d+).trim")forxinall......