Я підозрюю, що проблема пов'язана з деякими нюансами strtotime()
.
strtotime()
може приймати майже будь-який рядок і перетворювати його в часову позначку Unix. Проблема полягає в тому, що коли рядок не містить явного часового поясу, він буде використовувати те, що встановлено date_default_timezone_get()
. Це має бути встановлено у поточного користувача (він встановлюється проксі-сервером облікового запису). Однак рядок, з якої ви витягуєтесь, $node->field_date->value
неявно в UTC. Іншими словами, я думаю, що розбирається рядок strtotime()
трактується як "America / New_York", а не "UTC".
Хороша новина полягає в тому, що ви можете значно спростити ситуацію. Елемент поля для діапазону дат складається з чотирьох частин
- 'value' - дата початку як рядок у UTC
- 'start_date' - об’єкт DrupalDateTime, що представляє "значення"
- 'end_value' - дата закінчення як рядок у UTC
- 'end_date' - об’єкт DrupalDateTime, що представляє 'end_value'
Для звичайного поля часу вони є
- 'value' - дата у вигляді рядка в UTC
- 'date' - об’єкт DrupalDateTime, що представляє 'value'
Отже, ви можете працювати з DrupalDateTime()
об’єктом безпосередньо. Крім того, ця date.formatter
послуга повинна використовувати відповідний часовий пояс, який використовує користувач, який переглядає сторінку за замовчуванням (крім використання активної мови користувача).
Я підозрюю, що щось подібне спрацює
$node = Node::load(2100);
$start_date = $node->field_date->start_date;
$formatted = \Drupal::service('date.formatter')->format(
$start_date->getTimestamp(), 'custom', 'Y-m-d H:i:s P'
);
Примітка. Я додав там заповнювач формату "P", щоб ви могли побачити, який часовий пояс використовується для системи.
Переконайтеся, що у адміністраторі / конфігурації / регіональному / налаштуваннях встановлено належний часовий пояс, і що ваш часовий пояс користувача - це те, чого ви очікуєте. Також переконайтеся, що у вашому php.ini встановлено належний часовий пояс (це date.timezone
налаштування); дивні речі трапляються, коли це не встановлено (І вгорі голови, я не пам'ятаю, чи це викликає попередження в інсталяторі чи у звіті про стан, коли не встановлено. Я пам’ятаю проблему, але чи не отримала вона вчинено).
date
функцію доступу до DrupalDateTime. З цікавості, як ви це зрозуміли? Я зміг зрозуміти, що моє поле такого типу,DateTimeItem
але всередині цього не здається очевидним, що для цього класу єdate
(абоvalue
) громадський член.