Неверное время при использовании выбора даты: ошибка?

Здравствуйте,

Мой 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 лайка

Я убираю кавычки у tz, это не долгосрочное решение, но… работает :grin:

2 лайка

Да, извините, я отсутствовал в понедельник/вторник. У меня не удаётся воспроизвести проблему локально, но, думаю, это тот же случай.

Я применил следующее исправление:

Технически это скорее баг, связанный с отображением текста/Markdown, чем с локальными датами. Возможно, стоит найти более универсальное решение. Хотя жалобы на это я получал только в контексте локальных дат, вероятно, потому что этот функционал используется чаще и его чаще правят вручную.

4 лайка

Похоже, это не работает. Возможно, проблема в условии на строке 99 файла discourse-local-dates.js.es6:

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:00 на последние два

Раз вы можете воспроизвести проблему, попробуйте добавить лог здесь: 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? Я совсем не эксперт, просто немного энтузиаст! И извини, я перепутал пятёрку с шестёркой или не знаю что, но работает только третий вариант, моя ошибка: четвёртый не работает в превью, но в готовом посте всё верно :crazy_face:

1 лайк

Я отправил ещё один pull request. Возможно, стоит подождать, прежде чем вы начнёте разбираться.

2 лайка

Из того, что мне удалось увидеть, следует, что атрибут «data-timezone» отсутствует (когда что-то не работает)

Сообщение

  Post Update (1.1 мс)  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 лайк

Да, возможно, есть две проблемы — фронтенд и бэкенд, потому что предыдущее исправление точно улучшило случай с немецким языком. Думаю, я могу применить тот же регулярный выражение на фронтенде. Жаль, что я не могу воспроизвести это :sweat_smile:

Сделаю это завтра.

5 лайков

@Benjamin_D / @j.jaffeux это всё ещё проблема?

1 лайк

Думаю, что так, но я немного отстал: у меня всё ещё 2.6.0 beta5 :flushed:. Хотя с октября я не видел ни одного коммита, связанного с этой проблемой.