Вы здесь

Элементы Datetime и Datelist подчинены атрибуту #date_timezone

В ветку Друпал 8.7.х внесено изменение, которое подчиняет элементы Datetime и Datelist атрибуту #date_timezone. Сводка:

  • Элементы Datetime и Datelist имеют свойство #date_timezone, которое влияет на часовой пояс используемый для показа и интерпретации дат
  • Ранее идея заключалась в том, что если у вас уже есть дата при создании элемента, то нужно установить часовой пояс объекта date, который и будет использоваться. Если же существующей даты нет, то будет использоваться то, что определено в атрибуте #date_timezone
  • Логика часового пояса не всегда работала по рекомендации доктора. Подробности смотрите на странице #2799987: Datetime and Datelist element's timezone handling is fragile, buggy and wrongly documented
  • Теперь логика изменена и часовой пояс всегда принимает значение #date_timezone, которое по умолчанию получается из drupal_get_user_timezone()

До

Разработчики должны были установить часовой пояс для объекта data, который определялся атрибутом #default_value:

$element = [
  '#type' => 'datetime',
  '#default_value => $some_date->setTimezone(new DateTimeZone('Europe/London')),
  '#date_timezone => 'Europe/London',
];

После

Достаточно использовать атрибут #date_timezone:

$element = [
  '#type' => 'datetime',
  '#default_value' => $some_date,
  '#date_timezone => 'Europe/London',
];

Часовой пояс определённый атрибутом #default_value игнорируется.

Обратная совместимость

В большинстве случаев это не приведёт к изменению поведения, потому что ранее элемент работал правильно только в ограниченном диапазоне обстоятельств, при которых поведение не изменяется. Но возможно нарушение обратной совместимости для расширенных элементов. Если какой-либо элемент расширяет элементы Datetime или Datelist, то обработка часового пояса может измениться, особенно если:

  • Он зависит от значения по умолчанию в #date_timezone являющегося пустой строкой (теперь это drupal_get_user_timezone())
  • Изменена логика обработки в одном, а не обеих способах valueCallback() и processDatetime() (и следовательно будет непредсказуемое взаимодействие с новой логикой в других непереопределённых способах)