Podejrzewam, że problem dotyczy niektórych niuansów strtotime()
.
strtotime()
może pobrać dowolny ciąg znaków i przekonwertować go na uniksowy znacznik czasu. Problem polega na tym, że gdy ciąg nie zawiera wyraźnej strefy czasowej, użyje tego, co jest ustawione date_default_timezone_get()
. Powinno to być ustawione od bieżącego użytkownika (ustawia to proxy konta). Ciąg, z którego się wyciągasz, $node->field_date->value
jest jednak domyślnie w UTC. Innymi słowy, myślę, że ciąg jest analizowany przez strtotime()
jest interpretowany jak w „America / New_York”, a nie „UTC”.
Dobra wiadomość jest taka, że możesz bardzo uprościć swoją sytuację. Element pola dla zakresu dat składa się z czterech części
- „wartość” to data początkowa jako ciąg znaków w UTC
- „data_początkowa” to obiekt DrupalDateTime reprezentujący „wartość”
- „wartość_końcowa” to data końcowa jako ciąg znaków w UTC
- „data_końcowa” to obiekt DrupalDateTime reprezentujący „wartość_końcową”
Są to zwykłe pola daty i godziny
- „wartość” to data w postaci ciągu w UTC
- „data” to obiekt DrupalDateTime reprezentujący „wartość”
Możesz więc pracować z DrupalDateTime()
obiektem bezpośrednio. Ponadto date.formatter
usługa ta powinna pobrać odpowiednią strefę czasową używaną przez użytkownika domyślnie przeglądającego stronę (oprócz korzystania z aktywnego języka użytkownika).
Podejrzewam, że coś takiego zadziała
$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'
);
Uwaga Dodałem tam symbol zastępczy formatu „P”, abyś mógł zobaczyć, jaka strefa czasowa jest używana przez system.
Upewnij się, że masz skonfigurowaną odpowiednią strefę czasową w admin / config / regional / settings i że twoja strefa czasowa użytkownika jest tym, czego oczekujesz. Upewnij się także, że masz właściwą strefę czasową w pliku php.ini (jest to date.timezone
ustawienie); dziwne rzeczy zdarzają się, gdy nie jest to ustawione (I z góry mojej głowy, nie pamiętam, czy to powoduje ostrzeżenie w instalatorze lub w raporcie stanu, gdy nie jest ustawione. Pamiętam problem, ale nie wiem, czy zobowiązany).
date
funkcji dostępu do DrupalDateTime. Z ciekawości, jak to wymyśliłeś? Byłem w stanie dowiedzieć się, że moje pole było tego typu,DateTimeItem
ale nie wydaje się oczywiste, że istniejedate
(lubvalue
) członek publiczny dla tej klasy.