Некорректное время публикации комментариев

Главные вкладки

Аватар пользователя Москвабад Москвабад 7 января в 15:48

Так получилось, что на новом сайте (взял VPS в США) приходится вручную в базе данных восстанавливать время публикации старых комментариев. Выставляю правильный timestamp, а на сайте дата отличается на 2 дня и даже минуты не соответствуют таймстампу.

Сервер настроен на Europe/Moscow. Drupal тоже настроен на Москву.

При этом, если через сайт постить сообщения, то все корректно получается.

Подскажите, пожалуйста, где мой косяк, как пофиксить?

Лучший ответ

Аватар пользователя OldWarrior OldWarrior 9 января в 15:47

PS. Открываем stable9 и находим шаблон comment.html.twig. В комментарии вверху шаблона видим такие строчки:

 * - created: Formatted date and time for when the comment was created.
 *   Preprocess functions can reformat it by calling DateFormatter::format()
 *   with the desired parameters on the 'comment.created' variable.
 * - changed: Formatted date and time for when the comment was last changed.
 *   Preprocess functions can reformat it by calling DateFormatter::format()
 *   with the desired parameters on the 'comment.changed' variable.

Ключевые слова здесь: Formatted date and time...

То есть, в теории переменные created и changed уже отформатированы как строка. Применять к ним фильтр date() не нужно.

Таким образом, либо:

{{ created }}

либо заново строить формат от таймштампа:

{{ comment.created.value|date('d/m/Y - H:i:s') }}

Что-то одно из двух.

Комментарии

Аватар пользователя OldWarrior OldWarrior 7 января в 19:14

Москвабад wrote: Выставляю правильный timestamp, а на сайте дата отличается на 2 дня и даже минуты не соответствуют таймстампу.

Почему вы так уверены, что выставляете правильный таймштамп?

Я было хотел посоветовать проверить PHP date.timezone (в php.ini), но поскольку вы сообщаете, что при размещении комментария через форму всё ОК, то причина не в этом.

Остаётся сомнение в "правильных" таймштампах. Как вы их генерируете/получаете?

Аватар пользователя OldWarrior OldWarrior 8 января в 10:51

Вы что-то частично наконвертили не то. Проверил через свой конвертер дат (сделал когда-то на локалке).

Москвабад wrote: 28.09.2024 - 1736307164 - на сайте отображается как 01.10.2024

1736307164 - это вообще сегодняшний день. А именно 08.01.2025 - 06:32:44

Москвабад wrote: А этот штамп - 1727969955 - вообще как 08.10.2024 отображается на сайте, хотя это 03.10.2024

1727969955 у меня конвертируется как 03.10.2024 - 18:39:15. Т.е. здесь всё верно.

Думаю, стоит проверить:
1. ситуацию с кешем.
2. как именно в шаблонах вывода комментария (Twig) обрабатывается дата коммента.

Аватар пользователя Москвабад Москвабад 8 января в 15:19

1727549595 - 28-09-2024
но отображается как 01.10.2024
Кэш активно и много раз очищал как в самом Drupal так и на компьютере, на планшете.

{{ created | date ('d.m.Y H:i') }}

Аватар пользователя OldWarrior OldWarrior 9 января в 6:21

1. У меня есть мысль, что в таблице сущности комментария (comment_field_data) помимо правки поля created всё же нужно такое же значение (или не менее) ставить и для поля changed. Иначе тут возможны коллизии. Эти два поля обычно стандартные для всех типов сущностей и присутствуют в BaseFieldDefinition во всех случаях.

2. Вторая мысль: в таблице comment_entity_statistics есть ещё одно поле last_comment_timestamp, в которое пишется таймштамп последнего комментария для конкретной ноды. В зависимости от представления, может выводиться и это значение (например, в тизерах/анонсах нод). Стало быть, это значение также должно быть идентичным вашему исправленному таймштампу.

Аватар пользователя OldWarrior OldWarrior 9 января в 7:30

Москвабад wrote: В coment_entity_statistics у меня всего одна строка

Нода тоже всего одна на сайте? В любом случае вопрос скорее праздный, поскольку криминала я на ваших скриншотах не увидел.

Есть ещё смутная мысль, что тут присутствует какая-то чехарда с ревизиями материалов. Поле комментария в теории сохраняется в ревизиях ноды также, как и любое другое поле. Вот только хранит ли ревизия поля коммента его даты - тут не могу сказать навскидку.

Думаю, тут уместнее менять подход к обновлению комментариев. Обновлять не вручную через прямую правку значений в рядах БД, а через друпаловскую API-механику сохранения/обновления сущности комментария. То есть, возможно, написать какой-то батч или просто кастомную форму правки коммента с полями "created" и "changed", и сохраняться, используя Comment::save().

Аватар пользователя Москвабад Москвабад 9 января в 11:25

1. Установил чистый Drupal 11
2. Создал пользователей наделив их админскими правами
3. Заходил под именем каждого пользователя и вставлял копии комметариев

Аватар пользователя OldWarrior OldWarrior 9 января в 14:07

Москвабад wrote: 1. Установил чистый Drupal 11
2. Создал пользователей наделив их админскими правами
3. Заходил под именем каждого пользователя и вставлял копии комметариев

И что? Не понял смысл месседжа.

Аватар пользователя Москвабад Москвабад 9 января в 14:22

На всякий случай прояснил и уточнил ситуацию. И вдобавок подумал, что может это как-то связано с тем, что я сам насоздавал юзеров с админскими правами.

У меня этот сервер в США. Подумал, что возможно как то связано с этим. Сейчас на российский VPS поставил Drupal, импортировал базу - всё тоже самое.

И почему-то время отображается то, которое на компьютере, а не в таймштампе. Может я неправильно написал: <?php{{ created | date ('d.m.Y H:i') }}?>

Аватар пользователя OldWarrior OldWarrior 9 января в 15:29

Москвабад wrote: Может я неправильно написал: <?php{{ created | date ('d.m.Y H:i') }}?>

Пробел между date и её аргументами совсем не нужен. Честно говоря, я бы и вокруг оператора | убрал все пробелы:

{{ created|date('d.m.Y H:i') }}

А так - да, если вы видите текущее время - значит, где-то date работает без аргументов. Возможно, после удаления пробелов что-то прояснится.

Однако, остаётся неясным почему тогда (как вы говорите) новые комментарии (созданные стандартным образом) отображаются с корректным значением даты/времени.

Аватар пользователя OldWarrior OldWarrior 9 января в 15:37

Стоп, а откуда вы вообще берёте created в Twig-шаблоне комментария? У вас какой-то кастомный препроцесс записывает это значение в отдельную переменную? Потому что у меня (взял первый попавшийся проект из рабочих) в шаблоне комментария сделано так:

{{ comment.created.value|date('d/m/Y - H:i:s') }}

То есть, в данном примере значение читается из сущности comment, которая поступает в шаблон Twig. Также обратите внимание, что есть явное обращение к элементу value внутри created.

Аватар пользователя OldWarrior OldWarrior 9 января в 15:47

PS. Открываем stable9 и находим шаблон comment.html.twig. В комментарии вверху шаблона видим такие строчки:

 * - created: Formatted date and time for when the comment was created.
 *   Preprocess functions can reformat it by calling DateFormatter::format()
 *   with the desired parameters on the 'comment.created' variable.
 * - changed: Formatted date and time for when the comment was last changed.
 *   Preprocess functions can reformat it by calling DateFormatter::format()
 *   with the desired parameters on the 'comment.changed' variable.

Ключевые слова здесь: Formatted date and time...

То есть, в теории переменные created и changed уже отформатированы как строка. Применять к ним фильтр date() не нужно.

Таким образом, либо:

{{ created }}

либо заново строить формат от таймштампа:

{{ comment.created.value|date('d/m/Y - H:i:s') }}

Что-то одно из двух.

Аватар пользователя OldWarrior OldWarrior 10 января в 12:07

Москвабад wrote:
У меня 11 версия Drupal. Там в comment.html.twig просто created, а не comment.created

Это (версия) здесь не имеет значения. Просто если используете created, то это УЖЕ отформатированное в строку представление даты (скорее всего в стандартном формате medium/средняя - т.е. типа "пт, 10/01/2025 - 11:59:41"). И применяя к ней фильтр |date('d.m.Y H:i') вы по сути пытаетесь подсунуть вместо таймштампа (ожидаемого числа) готовую строку даты. В этом случае date() считает строку неподходящим/невалидным аргументом и выдаёт просто текущую дату/время.

Поэтому, если уж выводить created, то нужно именно просто {{ created }}, без дополнительного фильтра-форматтера. Но формат даты будет какой-то стандартный, друпаловский.

В случае с {{ comment.created.value|date('d/m/Y - H:i:s') }} можно уже нарулить собственный формат даты, поскольку comment.created.value является именно таймштампом комментария, т.е. числом.

Аватар пользователя Москвабад Москвабад 10 января в 16:20

Верно, если просто {{ created }} то дату не выводит, а только пишет, что сообщение было опубликовано вчера, 2 дня назад, 3 недели назад и т. п. - это-же отстой какой-то 🙂