Anstatt mit Zeitzonen herumzuspielen, warum nicht einfach
ALTER TABLE `your_table`
CHANGE `date_added` `date_added`
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
Das wird sich ändern Ihre Spalte von einer DATE-Spalte in eine TIMESTAMP-Spalte , und konvertiert dabei alle Daten in ihre jeweiligen UTC-Zeitstempel.
Wenn eine neue Zeile eingefügt wird, wird der aktuelle Zeitstempel verwendet als Wert . Zeitstempel sind immer in UTC, sodass Sie weder die Zeitzone auf Ihrem MySql-Server ändern noch das Datum angeben müssen, wenn Sie eine neue Zeile einfügen.
Wenn Sie Ihre Spalten nicht ändern können oder wollen, können Sie den Zeitstempel auch einfach über
auswählenSELECT UNIX_TIMESTAMP('date_added') FROM your_table;
Für Ihr TimeAgo können Sie dann einfach tun
$now = new DateTime;
$dateAdded = new DateTime("@$yourTimestampFromDb");
$dateAdded->setTimezone($now->getTimezone());
$timeSinceAdded = $dateAdded->diff($now);
Wenn Sie DateTime einen Zeitstempel zuweisen, wird immer UTC verwendet, unabhängig von Ihrer standardmäßigen Server-Zeitzone. Folglich müssen Sie entweder $dateAdded
umwandeln in die Standardzeitzone (wie oben gezeigt) oder konvertieren Sie $timeSinceAdded
nach UTC.
Um dateTime auf die Zeitzone des aktuell besuchenden Benutzers zu ändern, können Sie entweder
- müssen diese Informationen in Ihrer Datenbank haben, z. weil Sie registrierte Benutzer bitten, diese Informationen bereitzustellen
- oder Sie bestimmen es zur Laufzeit, normalerweise indem Sie eine GeoIP-Suche durchführen der IP des besuchenden Benutzers oder durch Senden des DateTime-Offsets vom Browser des Benutzers.
In jedem Fall ändern Sie dann einfach beide DateTimes in diese Zeitzone. Das geht ganz einfach über setTimezone()
.
Der $timeSinceAdded
wird dann ein DateInterval
sein Objekt, das Sie so verwenden können
echo $timeSinceAdded->format('%a total days');
Bitte beachten Sie die Links für weitere Details, zum Beispiel zu den verfügbaren Formatmodifikatoren.