如何在Python中将NYSE收盘EST16:00时间转UTC用于redis-rq任务调度
解决美股收盘时间(EST/EDT 16:00)转UTC并调度redis-rq任务的问题
核心问题在于你用了datetime.time对象,它缺少日期信息,无法正确处理夏令时(EST/EDT)的时区偏移变化。必须结合触发当日的日期生成带时区的完整datetime对象,再转换为UTC。
可行方案
方法1:使用pytz(兼容Python3.6+)
import datetime import pytz from redis import Redis from rq import Queue # 获取触发任务当日的日期(交易日内触发,直接取本地日期即可) today = datetime.date.today() # 构造当日美股收盘时间:EST/EDT 16:00,用pytz的localize方法绑定时区(避免直接用tzinfo参数的夏令时问题) ny_tz = pytz.timezone('US/Eastern') closing_time_est = ny_tz.localize(datetime.datetime(today.year, today.month, today.day, 16, 0, 0), is_dst=None) # 转换为UTC时间 closing_time_utc = closing_time_est.astimezone(pytz.utc) # 调度redis-rq任务 redis_conn = Redis() q = Queue(connection=redis_conn) q.enqueue_at(closing_time_utc, 你的任务函数, *任务参数)
方法2:使用zoneinfo(Python3.9+推荐,无需额外安装库)
import datetime from zoneinfo import ZoneInfo from redis import Redis from rq import Queue today = datetime.date.today() # 构造带时区的收盘时间(America/New_York包含夏令时自动切换) closing_time_ny = datetime.datetime(today.year, today.month, today.day, 16, 0, 0, tzinfo=ZoneInfo("America/New_York")) # 转换为UTC closing_time_utc = closing_time_ny.astimezone(ZoneInfo("UTC")) # 调度任务 redis_conn = Redis() q = Queue(connection=redis_conn) q.enqueue_at(closing_time_utc, 你的任务函数, *任务参数)
关键说明
- 不要直接用
datetime.time(16,0,tzinfo=pytz.timezone('US/Eastern')):time对象没有日期,pytz无法判断当前是EST还是EDT,导致偏移计算错误。 is_dst=None参数:pytz的localize方法用这个参数会在遇到夏令时切换的模糊时间时抛出异常,避免错误的时区转换(美股收盘时间16:00不会出现模糊情况,所以安全)。- redis-rq的
enqueue_at方法要求传入带UTC时区的datetime对象,直接传入转换后的closing_time_utc即可。
内容的提问来源于stack exchange,提问作者Shayka
相关产品推荐
相关产品推荐

