跳转到内容

协调世界时 UTC

UTC 是服务端系统最推荐的存储时间口径。它不依赖用户电脑、不依赖服务器所在城市,也不会因为夏令时显示规则变化而改变数据库里的原始时间。

官方参考:Historical Bar Data

TWS API 的 UTC 时间通常写成:

yyyyMMdd-HH:mm:ss

注意日期和时间之间是短横线,不是空格。例如美东夏令时 20260612 15:59:00 US/Eastern 等于 UTC:

20260612-19:59:00
from datetime import datetime
from zoneinfo import ZoneInfo
# 先用交易所时区表达用户想看的时间
exchange_time = datetime(
2026, 6, 12, 15, 59, 0,
tzinfo=ZoneInfo("US/Eastern"),
)
# 转成 UTC 后,按 TWS API UTC 格式输出
utc_time = exchange_time.astimezone(ZoneInfo("UTC"))
end_time = utc_time.strftime("%Y%m%d-%H:%M:%S")
print(end_time) # 20260612-19:59:00
app.reqHistoricalData(
97031,
contract,
"20260612-19:59:00", # UTC 时间
"2 D",
"1 hour",
"TRADES",
1,
1,
False,
[],
)

同一 AAPL 请求在 formatDate=2 时返回 Unix 秒级时间戳:

FORMAT_DATE_2_ROWS=1781271000|1781272800|1781276400
DONE_FLAGS=97101,97102
NON_INFO_ERROR_COUNT=0

收到这类数值后,程序应在入库时按 UTC 处理,在页面展示时再转换成交易所时区或用户选择的时区。

字段建议
utc_time数据库主时间字段,用 UTC 保存
exchange_time可选保存,方便排查和展示
exchange_timezone保存 US/EasternAsia/Hong_Kong 等时区标识
raw_bar_date保存 TWS 原始返回字符串,方便复盘问题

UTC 适合程序存储层,不适合直接展示给普通用户。页面或报表展示时,应该再转换回交易所时区或用户选择的时区。这样既能保证数据库稳定,又能让人看到符合交易习惯的时间。