Так получилось, что на новом сайте (взял VPS в США) приходится вручную в базе данных восстанавливать время публикации старых комментариев. Выставляю правильный timestamp, а на сайте дата отличается на 2 дня и даже минуты не соответствуют таймстампу.
Сервер настроен на Europe/Moscow. Drupal тоже настроен на Москву.
При этом, если через сайт постить сообщения, то все корректно получается.
Подскажите, пожалуйста, где мой косяк, как пофиксить?
Комментарии
Почему вы так уверены, что выставляете правильный таймштамп?
Я было хотел посоветовать проверить PHP date.timezone (в php.ini), но поскольку вы сообщаете, что при размещении комментария через форму всё ОК, то причина не в этом.
Остаётся сомнение в "правильных" таймштампах. Как вы их генерируете/получаете?
https://www.epochconverter.com/
28.09.2024 - 1736307164 - на сайте отображается как 01.10.2024
А этот штамп - 1727969955 - вообще как 08.10.2024 отображается на сайте, хотя это 03.10.2024
Вы что-то частично наконвертили не то. Проверил через свой конвертер дат (сделал когда-то на локалке).
1736307164 - это вообще сегодняшний день. А именно 08.01.2025 - 06:32:44
1727969955 у меня конвертируется как 03.10.2024 - 18:39:15. Т.е. здесь всё верно.
Думаю, стоит проверить:
1. ситуацию с кешем.
2. как именно в шаблонах вывода комментария (Twig) обрабатывается дата коммента.
php.ini
[Date]
; Defines the default timezone used by the date functions
; https://php.net/date.timezone
date.timezone = "Europe/Moscow"
1727549595 - 28-09-2024
но отображается как 01.10.2024
Кэш активно и много раз очищал как в самом Drupal так и на компьютере, на планшете.
{{ created | date ('d.m.Y H:i') }}
Часы:минуты у всех комментов одинаковые получаются. Соответствуют времени на моем компьютере или планшете.
1. У меня есть мысль, что в таблице сущности комментария (comment_field_data) помимо правки поля created всё же нужно такое же значение (или не менее) ставить и для поля changed. Иначе тут возможны коллизии. Эти два поля обычно стандартные для всех типов сущностей и присутствуют в BaseFieldDefinition во всех случаях.
2. Вторая мысль: в таблице comment_entity_statistics есть ещё одно поле last_comment_timestamp, в которое пишется таймштамп последнего комментария для конкретной ноды. В зависимости от представления, может выводиться и это значение (например, в тизерах/анонсах нод). Стало быть, это значение также должно быть идентичным вашему исправленному таймштампу.
Я всегда оба поля заполняю одинаковой датой:
В coment_entity_statistics у меня всего одна строка:
Нода тоже всего одна на сайте? В любом случае вопрос скорее праздный, поскольку криминала я на ваших скриншотах не увидел.
Есть ещё смутная мысль, что тут присутствует какая-то чехарда с ревизиями материалов. Поле комментария в теории сохраняется в ревизиях ноды также, как и любое другое поле. Вот только хранит ли ревизия поля коммента его даты - тут не могу сказать навскидку.
Думаю, тут уместнее менять подход к обновлению комментариев. Обновлять не вручную через прямую правку значений в рядах БД, а через друпаловскую API-механику сохранения/обновления сущности комментария. То есть, возможно, написать какой-то батч или просто кастомную форму правки коммента с полями
"created"
и"changed"
, и сохраняться, используяComment::save()
.1. Установил чистый Drupal 11
2. Создал пользователей наделив их админскими правами
3. Заходил под именем каждого пользователя и вставлял копии комметариев
И что? Не понял смысл месседжа.
На всякий случай прояснил и уточнил ситуацию. И вдобавок подумал, что может это как-то связано с тем, что я сам насоздавал юзеров с админскими правами.
У меня этот сервер в США. Подумал, что возможно как то связано с этим. Сейчас на российский VPS поставил Drupal, импортировал базу - всё тоже самое.
И почему-то время отображается то, которое на компьютере, а не в таймштампе. Может я неправильно написал:
<?php{{ created | date ('d.m.Y H:i') }}?>
Пробел между date и её аргументами совсем не нужен. Честно говоря, я бы и вокруг оператора
|
убрал все пробелы:А так - да, если вы видите текущее время - значит, где-то date работает без аргументов. Возможно, после удаления пробелов что-то прояснится.
Однако, остаётся неясным почему тогда (как вы говорите) новые комментарии (созданные стандартным образом) отображаются с корректным значением даты/времени.
Стоп, а откуда вы вообще берёте
created
в Twig-шаблоне комментария? У вас какой-то кастомный препроцесс записывает это значение в отдельную переменную? Потому что у меня (взял первый попавшийся проект из рабочих) в шаблоне комментария сделано так:То есть, в данном примере значение читается из сущности
comment
, которая поступает в шаблон Twig. Также обратите внимание, что есть явное обращение к элементуvalue
внутриcreated
.PS. Открываем stable9 и находим шаблон
comment.html.twig
. В комментарии вверху шаблона видим такие строчки:* 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') }}
Что-то одно из двух.
У меня 11 версия Drupal. Там в comment.html.twig просто created, а не comment.created
Bingo!
Вот это всё вылечило:
{{ comment.created.value|date('d/m/Y - H:i:s') }}
Большое спасибо! 🙏
Это (версия) здесь не имеет значения. Просто если используете
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
является именно таймштампом комментария, т.е. числом.Верно, если просто {{ created }} то дату не выводит, а только пишет, что сообщение было опубликовано вчера, 2 дня назад, 3 недели назад и т. п. - это-же отстой какой-то 🙂