You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 13:28:21