版本: Discourse 2026.1.5 (ESR),discourse-calendar 插件
摘要
使用设定的时区(timezone="Europe/Berlin" 和 showLocalTime="true")创建的新事件,在下载 .ics 文件并导入 Outlook (Windows) 时,时间会显示错误,多出 1 小时。论坛本身显示的时间是正确的。仅受新事件影响,即通过 .ics 文件导入的情况。
复现步骤
- 创建一个事件(今天,处于夏令时 CEST/UTC+2):柏林时间下午 5:00 – 7:15。
[event start="2026-08-11 17:00" status="public" name="testevent 2" timezone="Europe/Berlin" showLocalTime="true" end="2026-08-11 19:15"]
[/event]
- 点击“添加到日历” → 下载
.ics 文件。
- 将文件导入 Outlook。
预期结果: 2026年8月11日,17:00 – 19:15
实际结果: 2026年8月11日,18:00 – 20:15(+1 小时)
ICS 内容(相关部分):
DTSTART;TZID=Europe/Berlin:20260811T170000
DTEND;TZID=Europe/Berlin:20260811T191500
(该文件不包含 Europe/Berlin 的 VTIMEZONE 块。)
分析 / 疑似原因
导出功能使用 TZID=Europe/Berlin(IANA 名称)指定本地时间,而非使用 UTC(...Z)。Outlook 无法识别 IANA 时区名称(它使用 Windows 标识符,如“W. Europe Standard Time”),且在缺少 VTIMEZONE 定义的情况下,会回退到固定偏移量 UTC+1(CET/冬令时)。在夏令时期间(CEST = UTC+2),这会导致恰好 多出 1 小时。交叉验证:将同一文件导入 Google Calendar(原生支持 IANA 时区)显示正确的时间 17:00。
建议:ICS 导出应要么使用带 Z 的 UTC 时间戳,要么生成包含 DST 规则的完整 VTIMEZONE 块(另见关于 ICS 规范遵从性的讨论:LOCATION is not available in full ICS export)。
其他观察: 当同一事件在不带 timezone=/showLocalTime 的情况下创建时,导出的 .ics 使用 UTC,Outlook 显示 多出 2 小时(因为 17:00 UTC = 19:00 CEST)。这是文档中记录的 UTC 行为,但这进一步说明了 ICS 导出周围的时区处理对于期望看到本地时间的用户来说令人困惑。
2 個讚
Ethsim2
(Ethan )
3
作为对比,由于之前的日历时区行为,我一直将我的 Discourse 主机和应用容器运行在本地 IANA 时区,而不是 UTC。
我的主机设置为:
timedatectl set-timezone Europe/London
而我的 app.yml 包含:
- exec: ln -fs /usr/share/zoneinfo/Europe/London /etc/localtime
- exec: dpkg-reconfigure --frontend noninteractive tzdata
这意味着我的主机和 Discourse 容器都使用 Europe/London,包括自动的 GMT/BST 切换。
或许值得在你的安装环境中测试等效的 Europe/Berlin 设置,看看生成的 .ics 文件是否能正确导入到 Outlook 中:
timedatectl set-timezone Europe/Berlin
以及在 run: 部分中:
- exec: ln -fs /usr/share/zoneinfo/Europe/Berlin /etc/localtime
- exec: dpkg-reconfigure --frontend noninteractive tzdata
我想知道这是否会将你柏林时间 17:00 的事件从导入为 18:00 改为预期的 17:00。
如果确实如此,那就表明 Discourse/容器时区影响了导出;如果没有,则缺失的 VTIMEZONE/Outlook 处理可能独立于服务器时区。
Tonja
(Tonja)
4
我们也遇到了完全相同的问题。
复现步骤:
- 创建事件时设置了
timezone="Europe/Berlin" 和 showLocalTime="true",且处于 CEST(夏令时)期间。
- 通过“添加到日历”功能下载
.ics 文件,并导入到 Outlook 中。
实际结果: 事件时间显示偏移了 +1 小时(例如,柏林时间 17:00 在 Outlook 中显示为 18:00)。
预期结果: 事件应显示为输入的 17:00。
我们可以确认,在 CEST 期间发生的事件始终会出现此问题,而非间歇性出现。CEST 期间之外的事件不受影响。
我们非常希望看到此问题得到修复,因为我们的用户对故障非常敏感 
我对此进行了进一步调查,并打开了一个 PR 来解决该问题:
问题出在 ICS 导出上,而不是服务器/容器的时区。导出的事件使用了 IANA TZID(例如 Europe/Berlin),但目前未包含对应的 VTIMEZONE 定义,而 Outlook 等客户端需要该定义才能可靠地解释夏令时规则。
该 PR 在支持时区的 ICS 下载中添加了 VTIMEZONE 定义,同时保留了现有的本地 DTSTART/DTEND 值。
对于本主题中的示例,导出内容现在包含了 Europe/Berlin 的 CET/CEST 实施情况,因此:
DTSTART;TZID=Europe/Berlin:20260811T170000
可以按正确的 UTC+2 夏季偏移量进行解释,而不是让 Outlook 回退到 UTC+1。
我还添加了针对欧洲和北美夏令时规则、固定偏移量情况以及 Africa/Casablanca 使用的更不寻常的季节性转换的测试覆盖。
2 個讚
Ethsim2
(Ethan )
6
@Michael_D @Tonja 修复已合并,很快会发布到 latest 分支 
1 個讚
你输入的时候我一直在关注流水线。修复已经合入 latest 了。感谢你的贡献 @Ethsim2!
1 個讚
Tonja
(Tonja)
9
2 個讚