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.DateTimeItem::propertyDefinitions()
, werden Sie sehen, was ausgesetzt ist. Dann schauen Sie sich anDateTimeComputed::getValue()
, wie das funktioniert. Auf diese Weise können alle Objektklassen untersucht werden, aber nur wenige verwenden berechnete Werte. Ich wünschte, es gäbe eine bessere Möglichkeit, dies der API zugänglich zu machen.DateTimeItem::propertyDefinitions()
. Ich nahm an, dass es einige magische Methoden gibt, wollte aber verstehen, wie diese erstellt wurden, damit ich besser verstehen konnte, wie ich auch auf andere Felder zugreifen kann. Wie Sie sagten, wäre es schön, wenn die API verfügbar gemacht würde, aber das hilft. Danke noch einmal.$node->field_date->date
statt$node->field_date->start_date
.Basierend auf der Behandlung der Zeitzonen-Konvertierung mit PHP DateTime habe ich meinen Code folgendermaßen geändert:
Und jetzt ist mein Ausgabedatum in Ordnung:
Das funktioniert. Aber ich bin mir sicher, dass es eine Möglichkeit gibt, dies mit der Drupal-API zu tun.
quelle
date_default_timezone_set(drupal_get_user_timezone());
Ich löse es normalerweise so:
quelle
Das hat bei mir funktioniert:
quelle
Dieser Code funktioniert für mich.
quelle
Keine dieser anderen Antworten hat für mich funktioniert. Dies ist, womit ich letztendlich fertig wurde:
quelle
Ich benutze dieses Snippet, um mit Daten zu arbeiten:
Weitere Informationen zum Datetime-Objekt erhalten Sie hier
quelle