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
相关产品推荐
相关产品推荐

