Ein interessantes Phänomen tritt auf, wenn in einer Extbase Query eine native DateTime Spalte mit einem DateTime Objekt verglichen wird. In diesem Beispiel soll die Methode findNext() das (nach Datum sortiert) nächst ältere Objekt ausgehend vom übergebenen Objekt zurückliefern.

Extbase Repository

/*
 * findNext
 *
 * @param \Vendor\Ext\Domain\Model\Post $post
 *
 * @return array|\TYPO3\CMS\Extbase\Persistence\QueryResultInterface
 */
public function findNext(\Vendor\Ext\Domain\Model\Post $post) {
	$query = $this->createQuery();
	$query->setOrderings(array('datePublished' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING));
	$query->matching($query->lessThan('datePublished', $post->getDatePublished()->format('Y-m-d H:i:s')));
	$nextPost = $query->execute()->getFirst();
	return $nextPost;
}

Abhängig von der Serverkonfiguration liefert die Query aber möglicherweise nicht das nächst ältere Objekt, sondern das zum übergebenen Objekt identische. Die Ursache wird ersichtlich, wenn man das generierte SQL Statement betrachtet:

WHERE tx_ext_domain_model_post.date_published < '2015-01-06 06:00:00'

Für das aktuelle Objekt ist in der Datenbank der Wert "2015-01-06 05:00:00" gespeichert. In der Query wird für das Zeit-Segment nun aber "05:00:00" anstelle "06:00:00" verwendet, denn Extbase berücksichtigt beim Erstellen der DateTime Property die aktuelle Timezone (Server, PHP), in diesem Fall UTC+1 (Europe/Berlin).

Da die Timezone in der Query nur auf der rechten Seite des Operators berücksichtigt wird und nicht ebenfalls auf der linken, findet die Query durch die Zeitdifferenz als nächst älteres Objekt wieder das identische Objekt. Ein möglicher Workaround wäre das Setzen von UTC als Timezone:

[SYS][phpTimeZone] = Europe/London

Dieses Setting beeinflusst jedoch die gesamte Installation und kann daher andere unerwünschte Nebeneffekte auslösen.

Bessere Ideen?

Mir sind keine bekannt und irgendwie erscheint das Ganze noch nicht so richtig ausgereift... Bei der konventionellen Methode hingegen (Unix Timestamp in Integer Column in Datenbank mit DateTime Property in Extbase) gibt es keinerlei Probleme. Diese ist sogar noch benutzerfreundlicher, da die Objekte in der Query ohne zusätzliche Formatierung verglichen werden können und es keine unerwünschten Nebeneffekte bedingt durch die Timezone gibt.

 





Kommentare

Michael Odendahl schrieb am 19.08.2015:
Hallo zusammen,

danke super Artikel, ich habe auch eine Lösung gefunden, bei der im Install Tool die Zeitzone nicht umgestellt werden muss. Einfach vor dem direkten Vergleich für den Vergleich die Zeitzone ändern.

In diesem Fall vor dem Matching:
$post->getDatePublished()->setTimezone( new \DateTimeZone( 'Europe/London' ));

Grüße,
Michael