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

Bokeh DatetimePicker是否自带时区?时区显示异常求助

Bokeh DatetimePicker 时区显示错误问题解决

问题原因

Bokeh 的 DatetimePicker 对时区的处理逻辑是:

  • 传入带时区的datetime对象时,会自动将其转换为 UTC 时区的 naive datetime(无时区信息)存储;
  • 传入naive datetime时,默认将其视为 UTC 时间;
  • 前端显示时,会把内部存储的 UTC 时间转换为浏览器所在的本地时区。

你的情况中:

  • 打印的 now 是 MST(UTC-7)时间 2024-01-10 10:32:42-07:00,Bokeh 会将其转换为 UTC 时间存储;
  • 当你尝试不传时区时,datetime.now() 得到的是 MST 本地时间的 naive datetime(10:32),但 Bokeh 直接把它当成了 UTC 时间,前端转成 MST 时区时就会显示 03:32(UTC 10:32 减去7小时时区差)。

解决方案

方法1:手动转换为 UTC 时间传入

如果希望前端显示正确的目标时区时间,先将时区时间转换为 UTC 的 naive datetime,这样前端会自动转成浏览器本地时区(如果浏览器时区和目标时区一致,就会显示正确时间):

from datetime import datetime
import pytz

mt_timezone = pytz.timezone('America/Edmonton')

# 获取当前MST时间,转换为UTC的naive datetime
now_mt = datetime.now(mt_timezone).replace(microsecond=0)
now_utc = now_mt.astimezone(pytz.utc).replace(tzinfo=None)

end_picker = DatetimePicker(value=now_utc, title='End Time')

方法2:全局设置文档时区

如果你的整个应用都需要使用特定时区(比如 America/Edmonton),可以给 Bokeh 文档设置全局时区,这样所有时间组件都会遵循这个时区处理:

from bokeh.io import curdoc
from datetime import datetime
import pytz

mt_timezone = pytz.timezone('America/Edmonton')

# 设置文档全局时区
curdoc().theme.tz = mt_timezone

now = datetime.now(mt_timezone).replace(microsecond=0)
end_picker = DatetimePicker(value=now, title='End Time')

注意:该方法需要 Bokeh 2.4.0 及以上版本,旧版本对时区支持不完善。

关键注意点

  • 明确传入 DatetimePicker 的时间类型,避免将目标时区的 naive datetime 直接传入(会被当成 UTC 处理);
  • 若跨时区部署,需确保前端浏览器时区或文档全局时区的设置符合需求。

内容的提问来源于stack exchange,提问作者Sina Safarabadi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 08:05:54