Я подозреваю, что проблема связана с некоторыми нюансами 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
Для простого поля даты и времени они
- «значение» - это дата в виде строки в формате UTC
- date - это объект DrupalDateTime, представляющий значение
Таким образом, вы можете работать с 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», чтобы вы могли видеть, какой часовой пояс используется системой.
Убедитесь, что вы правильно настроили часовой пояс в admin / config / Regional / settings, и что ваш пользовательский часовой пояс - это то, что вы ожидаете. Также убедитесь, что у вас установлен правильный часовой пояс в php.ini (это date.timezone
настройка); странные вещи случаются, когда это не установлено (и я не помню, вызывает ли это предупреждение в установщике или в отчете о состоянии, когда не установлено. Я помню проблему, но не знаю, получилось ли это совершенные).
date
возможности доступа к DrupalDateTime. Из любопытства, как ты это понял? Я смог выяснить, что мое поле относится к типу,DateTimeItem
но там не кажется очевидным, что для этого класса естьdate
(илиvalue
) открытый член.