使用日期选择器时时间错误:bug?

你好,

我的 Discourse(版本 2.6.0.beta4)已配置将 Europe/Paris 设为默认的本地日期时区,但当我尝试选择时间时,显示的时间不正确,如下截图所示:

即使我输入"20:00:00",显示的时间却是“今天 22:00”。我在浏览器中执行的 moment.tz.guess() 返回的是"Europe/Paris",所以我不太清楚问题出在哪里。

有什么建议吗?

谢谢,

3 个赞

@j.jaffeux 有什么想法吗,这可能是什么原因导致的?

2 个赞

我认为这是对法语引号(如果我没记错的话,是 bbcode)处理不当的问题,该问题已在德语本地化中解决。

https://meta.discourse.org/t/locale-date-timezone-cooking-error-with-french-localization/161532

3 个赞

我把时区标识符的引号去掉了,这并非长久之计,但……它奏效了😁

2 个赞

是的,抱歉,我周一/周二不在。我在本地无法复现,但我觉得是同样的问题。

我采用了这个修复方案:

从技术上讲,这更像是一个文本/Markdown 显示问题,而非本地日期问题。我们或许需要一个更全局的解决方案。不过,目前我只在本地日期的上下文中收到过相关投诉,我猜这是因为该功能使用更频繁,且更可能被手动编辑。

4 个赞

我觉得它似乎不起作用,discourse-local-dates.js.es6 第 99 行的条件可能也有问题:

if (config.timezone && moment.tz.names().includes(config.timezone))

这个条件实际上并不成立(但应该是成立的)。

编辑
我刚刚意识到修复已经提交到了另一个分支,我稍后再回来 :sweat_smile:
……所以,我检查了一下:

[date=2020-12-20 time=15:00:00 timezone=„Europe/Paris“]
[date=2020-12-20 time=15:00:00 timezone=Europe/Paris]
[date=2020-12-20 time=15:00:00 timezone="Europe/Paris"]
[date=2020-12-20 time=15:00:00 timezone=«Europe/Paris»]

分别是:正确、正确、错误、错误。

1 个赞

另外,在我的法语 AZERTY 键盘上,引号实际上是 "。我甚至不知道如何输入 «»,除非复制粘贴,这大概很正常 :thinking:

我当然不认为有任何“错误”:

关键在于,这些引文并非由你亲自撰写,而是某种转换过程产生的。

1 个赞

有点奇怪,最后两个我都有16小时。

既然您能复现该问题,能否尝试在此处添加一条日志:https://github.com/discourse/discourse/blob/master/plugins/discourse-local-dates/assets/javascripts/lib/discourse-markdown/discourse-local-dates.js.es6#L15

console.log(matches[1]);

并告诉我您看到的具体输出内容。

1 个赞

当然啦!不过你把我绕晕了 :smile: 我猜你想要的是 Rails 日志?我可不是专家,只是个有点热情的爱好者!
另外抱歉,我把 5 看成 6 了,或者我也不太清楚,只有第三个不行,我的错。第四个在预览里不生效,但在发布后的帖子中是正确的 :crazy_face:

1 个赞

我又提交了一个拉取请求,也许在你深入之前先等等吧。

2 个赞

我能看到的问题是(当某些功能无法工作时)缺少了“data-timezone”属性:

消息

  Post Update (1.1ms)  UPDATE "posts" SET "raw" = '[date=2020-12-20 time=12:00:00 timezone=Europe/Paris]
[date=2020-12-20 time=12:00:00 timezone="Europe/Paris"]', "self_edits" = 3, "cooked" = '<p><span data-date="2020-12-20" data-time="12:00:00" class="discourse-local-date" data-timezone="Europe/Paris" data-email-preview="2020-12-20T11:00:00Z UTC">2020-12-20T11:00:00Z</span><br>
<span data-date="2020-12-20" data-time="12:00:00" class="discourse-local-date" data-email-preview="2020-12-20T12:00:00Z UTC">2020-12-20T12:00:00Z</span></p>', "baked_at" = '2020-10-21 15:25:53.050518', "updated_at" = '2020-10-21 15:25:53.050721' WHERE "posts"."id" = 1954
1 个赞

是的,因为它无法识别转换后的引号,所以我正试图强制将它们置于一种已知状态。

2 个赞

很抱歉提出这个问题,之后我会让您继续工作。我原以为是 &laquo; 中的 ; 导致 && moment.tz.names().includes(config.timezone) 失败。请问 config.timezone 是否被进行了 HTML 转义?

1 个赞

别担心,我完全可能搞错 :smiley:

所以,你问的其实就是我正在做的事,只是时间点可能和你预期的不太一样,不过那样应该也行。比如在修复之前,像这样的代码:

[date=2020-12-20 time=15:00:00 timezone=«Europe/Paris»]

在解析后的 Markdown 中会得到这些属性:

{"date"=>"2020-12-20", "time"=>"15:00:00", "timezone"=>"«Europe/Paris»"}

问题显而易见。

修复之后,我们得到的是:

{"date"=>"2020-12-20", "time"=>"15:00:00", "timezone"=>"Europe/Paris"}

我只是觉得之前没有处理所有带引号的情况。你试过我提交的第二个版本了吗?

2 个赞

是的……

但原始内容并不是

[date=2020-12-20 time=15:00:00 timezone=«Europe/Paris»]

而是已经是

[date=2020-12-20 time=15:00:00 timezone="Europe/Paris"]

我觉得问题出在“更下游”的地方:thinking:,我其实不知道具体在哪里。&laquo;&raquo; 是在哪里被引入的。
啊,对了!我可以在编辑器预览中看到
[date=2020-12-15 time=14:00:00 timezone="Europe/Paris"]
变成了
[date=2020-12-15 time=14:00:00 timezone=« Europe/Paris »

1 个赞

是的,可能前后端都存在两个问题,因为之前的修复确实改善了德语的情况。我想我可以直接在前端应用相同的正则表达式,真希望我能复现这个问题😅

明天再处理。

5 个赞

@Benjamin_D / @j.jaffeux 这个问题还存在吗?

1 个赞

我认为是的,但我有点滞后,目前还在 2.6.0 beta5 版本:flushed 不过自十月以来,我还没看到任何关于该问题的提交。