如何在MediaWiki中按用户本地时间显示历史事件时间戳?
需求与解决方案:MediaWiki适配用户时区的历史时间展示
核心需求
- 文章中历史事件时间线的固定时间点(支持带时区的时间戳/日期)需自动适配用户时区展示
- 时区优先级:浏览器时区 > 用户「外观」设置的时区 > 维基默认时区
- 理想支持Visual Editor便捷插入,可选添加时区切换下拉框
已尝试无效方案
- Dynamic dates/日期格式与链接:MediaWiki 1.21已移除,不符合需求
- 魔术词(Magic words):仅显示UTC当前时间,无法处理历史时间点
- ParserFunctions的#time函数:始终显示UTC时间,非欧美用户体验差
- ParserFunctions的#timel函数:仅支持全局单一时区,无法适配不同用户,且仅支持源码编辑器
- StringFunctions扩展:ParserFunctions旧版本,已过时
- Semantic MediaWiki:Date类型不考虑用户时区设置
- 维基百科/火狐维基的日期格式模板:未找到有效方案
可行解决方案
现有扩展方案
Extension:TimezoneConverter
- 支持插入带时区标记的时间,自动根据用户时区(浏览器/用户设置)转换显示
- 提供可视化编辑器插件,可在Visual Editor中快速插入时间标记
- 部分版本支持时区切换下拉框,用户可手动切换查看不同时区的时间
Extension:DateFormatter
- 基于用户时区设置渲染日期时间,支持历史时间点的转换
- 可通过模板或解析函数调用,兼容Visual Editor的模板插入功能
自定义开发插件步骤
若现有扩展不满足需求,可自行开发MediaWiki扩展,步骤如下:
搭建扩展基础结构
- 创建扩展目录(如
extensions/UserTimezoneDate),包含主文件UserTimezoneDate.php、国际化目录i18n、前端资源目录resources - 在主文件中注册扩展,声明钩子、解析函数或可视化编辑器插件
- 创建扩展目录(如
实现后端逻辑
- 定义解析函数(如
#usertimezone),接收原始时间戳/带时区的日期字符串作为参数 - 获取时区优先级:优先取浏览器通过JS传递的时区,其次取用户
user_properties表中的timezone字段,最后使用全局配置$wgLocaltimezone - 利用PHP的
DateTime类完成时间转换,支持自定义输出格式
- 定义解析函数(如
开发前端交互
- 编写JS脚本,页面加载时获取浏览器时区,通过全局变量或AJAX传递给后端
- 实现时区切换下拉框:监听选择事件,触发页面时间元素的重新渲染
- 开发Visual Editor插件,添加插入时间的按钮,支持用户输入原始时间、选择时区,自动生成解析函数标记
测试与部署
- 在
LocalSettings.php中启用扩展:wfLoadExtension( 'UserTimezoneDate' ); - 测试不同时区用户、不同时间格式的转换效果
- 优化Visual Editor插入流程,确保操作便捷
- 在
内容的提问来源于stack exchange,提问作者azoundria
相关产品推荐
相关产品推荐

