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.DateTimeItem::propertyDefinitions()
, zobaczysz, co jest naświetlone. NastępnieDateTimeComputed::getValue()
sprawdź, jak to działa. Wszystkie klasy przedmiotów mogą być badane w ten sposób, ale tylko garstka użytych wartości obliczeniowych. Chciałbym, aby istniał lepszy sposób na udostępnienie tego interfejsu API.DateTimeItem::propertyDefinitions()
. Uznałem, że zdarzają się magiczne metody, ale chciałem zrozumieć, w jaki sposób zostały one stworzone, abym mógł lepiej zrozumieć, jak uzyskać dostęp do innych pól. Tak jak powiedziałeś, byłoby miło, gdyby API został ujawniony, ale to pomaga. Dzięki jeszcze raz.$node->field_date->date
zamiast$node->field_date->start_date
.W oparciu o obsługę konwersji strefy czasowej za pomocą PHP DateTime zmodyfikowałem kod do tego:
A teraz moja data wyjścia jest w porządku:
To działa. Ale jestem pewien, że można to zrobić za pomocą interfejsu API Drupal.
źródło
date_default_timezone_set(drupal_get_user_timezone());
Zwykle rozwiązuję to w ten sposób:
źródło
To działało dla mnie:
źródło
Ten kod działa dla mnie.
źródło
Żadna z tych innych odpowiedzi nie działała dla mnie. Z tym ostatecznie skończyłem:
źródło
Używam tego fragmentu do pracy z datami:
Możesz uzyskać więcej informacji o obiekcie Datetime tutaj
źródło