Я подозреваю, что проблема связана с некоторыми нюансами 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
) открытый член.DateTimeItem::propertyDefinitions()
, вы увидите, что выставлено. Затем посмотрите,DateTimeComputed::getValue()
как это работает. Все классы Предметов могут быть проверены таким образом, но лишь немногие используют вычисленные значения. Хотелось бы, чтобы был лучший способ показать это API.DateTimeItem::propertyDefinitions()
. Я подумал, что происходит несколько магических методов, но хотел понять, как они были созданы, чтобы я мог лучше понять, как получить доступ к другим полям. Как вы сказали, было бы неплохо, если бы API был выставлен, но это помогает. Еще раз спасибо.$node->field_date->date
, а не$node->field_date->start_date
.Основываясь на обработке преобразования часовых поясов с помощью PHP DateTime, я изменил свой код так:
И теперь моя дата выхода это хорошо:
Это работает. Но я уверен, что есть способ сделать это, используя Drupal API.
источник
date_default_timezone_set(drupal_get_user_timezone());
Я обычно решаю это так.
источник
Это сработало для меня:
источник
Этот код работает для меня.
источник
Ни один из этих ответов не помог мне. Это то, что я, наконец, закончил:
источник
Я использую этот фрагмент для работы с датами:
Вы можете получить больше информации об объекте Datetime здесь
источник