Ich vermute, das Problem hat mit einigen Nuancen von zu tun strtotime()
.
strtotime()
kann fast jede beliebige Zeichenfolge aufnehmen und in einen Unix-Zeitstempel konvertieren. Das Problem ist, dass die Zeichenfolge, wenn sie keine explizite Zeitzone enthält, das verwendet, was von festgelegt wird date_default_timezone_get()
. Dies sollte jedoch vom aktuellen Benutzer festgelegt werden (dies wird vom Konto-Proxy festgelegt). Die Zeichenfolge, aus der Sie ziehen, $node->field_date->value
ist jedoch implizit in UTC. Mit anderen Worten, ich denke, die Zeichenfolge, die analysiert strtotime()
wird, wird wie in 'America / New_York' und nicht wie in 'UTC' interpretiert.
Die gute Nachricht ist, dass Sie Ihre Situation erheblich vereinfachen können. Das Feldelement für einen Datumsbereich besteht aus vier Teilen
- 'Wert' ist das Startdatum als Zeichenfolge in UTC
- 'start_date' ist ein DrupalDateTime-Objekt, das 'value' darstellt
- 'end_value' ist das Enddatum als Zeichenfolge in UTC
- 'end_date' ist ein DrupalDateTime-Objekt, das 'end_value' darstellt
Für ein einfaches Datums- / Zeitfeld sind sie
- 'Wert' ist das Datum als Zeichenfolge in UTC
- 'date' ist ein DrupalDateTime-Objekt, das 'value' darstellt
Sie können also DrupalDateTime()
direkt mit dem Objekt arbeiten. Darüber hinaus sollte dieser date.formatter
Dienst die richtige Zeitzone verwenden, die vom Benutzer verwendet wird, der die Seite standardmäßig anzeigt (zusätzlich zur aktiven Sprache des Benutzers).
Ich vermute, dass so etwas funktionieren wird
$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'
);
Hinweis: Ich habe dort den Platzhalter im P-Format hinzugefügt, damit Sie sehen können, welche Zeitzone vom System verwendet wird.
Stellen Sie sicher, dass Sie in admin / config / regional / settings die richtige Zeitzone eingerichtet haben und dass Ihre Benutzerzeitzone Ihren Erwartungen entspricht. Stellen Sie außerdem sicher, dass in Ihrer php.ini die richtige Zeitzone eingestellt ist (dies ist die date.timezone
Einstellung). komische Dinge passieren, wenn dies nicht eingestellt ist (und ich kann mich nicht erinnern, ob dies eine Warnung im Installationsprogramm oder im Statusbericht verursacht, wenn es nicht eingestellt ist. Ich erinnere mich an das Problem, aber nicht, ob es aufgetreten ist engagiert sein).
date
Funktion zum Zugriff auf DrupalDateTime. Wie haben Sie das aus Neugier herausgefunden? Ich konnte herausfinden, dass mein Feld vom Typ war,DateTimeItem
aber es scheint nicht offensichtlich, dass es eindate
(oder einvalue
) öffentliches Mitglied für diese Klasse gibt.