Lilly
(Lillian )
13
好的,Moin 和我今天聊到了这个案例,她提出使用“每月”频率可能存在一个 Bug,因为月份的长度各不相同?当然,她是对的——至少部分正确:stuck_out_tongue:
不管怎样,我又做了一些深入调查:detective:
我实际上在核心 plugins/automation/lib/discourse_automation/scripts 文件夹中找不到 schedule pm with data-explorer results 的自动化脚本,所以它一定藏在其他地方。
不过,我查看了这里关于周期性(推测该脚本会用到)的逻辑,位于 plugins/automation/lib/discourse_automation/triggers/recurring.rb:
我认为,月度周期性自动化的底层代码计算的是“第 N 个星期几”,而不是实际的日历日期,这与“日历日期”存在逻辑不匹配的问题。具体来说,通过向 RRule 注入 BYDAY=#{count}#{byday},自动化系统强制对齐星期几,而应该使用 BYMONTHDAY 而不是 BYDAY。
因此,如果你将自动化设置为从 4 月 15 日开始(这一天恰好是 4 月的第 3 个星期三),系统会将该规则解读为:每月第 3 个星期三运行。
到了 5 月,第 3 个星期三是5 月 20 日,这导致计划偏移了 5 天。
此外,如果你将自动化设置在某月的 30 日或 31 日(例如“第 5 个星期二”),系统会在下个月寻找第 5 个星期二。如果那个月只有 4 个星期二,自动化将无法找到有效日期,并静默跳过整个月份。
我已经测试了一个修复方案,并正在提交 PR,如果团队想查看的话。该修复将逻辑从“第 N 个星期几”改为“精确的日历日期”。
以下是我在测试和调试过程中的一些截图:
两个实例,一个未修复,另一个应用了我的逻辑修复
在两者中创建完全相同的自动化(修复版本在右侧):
查看横幅中“下次自动化将在以下时间触发:”消息的差异,存在 5 天的偏移——未修复版本会偏移至第 3 个星期三(5 月 20 日),而不是 5 月 15 日。
例如,如果系统查找的是“第 4 个星期四”而不是实际日期,某些月份可能会被完全跳过。
也可以在 Rails 控制台中测试相同的结果
未修复版本:
修复后版本:
PR 链接如下:
2 个赞