Istället för att pilla med tidszoner, varför inte bara göra det
ALTER TABLE `your_table`
CHANGE `date_added` `date_added`
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
Detta kommer att ändras din kolumn från en DATE-kolumn till en TIMESTAMP-kolumn , konverterar alla datum till sina respektive UTC-tidsstämplar i processen.
När en ny rad infogas kommer att använda den aktuella tidsstämpeln som ett värde . Tidsstämplar är alltid i UTC, så du behöver inte ändra tidszonen på din MySql-server och inte heller ange datum när du infogar en ny rad.
Om du inte kan eller vill inte ändra dina kolumner kan du också bara välja tidsstämpel via
SELECT UNIX_TIMESTAMP('date_added') FROM your_table;
För din TimeAgo kan du sedan bara göra
$now = new DateTime;
$dateAdded = new DateTime("@$yourTimestampFromDb");
$dateAdded->setTimezone($now->getTimezone());
$timeSinceAdded = $dateAdded->diff($now);
När du anger en tidsstämpel till DateTime kommer den alltid att använda UTC oavsett vilken servertidszon du har angett som standard. Följaktligen måste du antingen konvertera $dateAdded
till standardtidszonen (som visas ovan) eller konvertera $timeSinceAdded
till UTC.
För att ändra dateTime till den aktuella användarens tidszon, kan du antingen
- måste ha denna information i din databas, t.ex. eftersom du ber registrerade användare att tillhandahålla denna information
- eller du bestämmer det vid körning, vanligtvis genom att göra en GeoIP-sökning på den besökande användarens IP eller genom att skicka DateTime Offset från användarens webbläsare.
I vilket fall som helst så ändrar du bara båda DateTimes till den tidszonen. Detta görs enkelt via setTimezone()
.
$timeSinceAdded
kommer då att vara ett DateInterval
objekt, som du kan använda så här
echo $timeSinceAdded->format('%a total days');
Se länkarna för ytterligare information, till exempel om tillgängliga formatmodifierare.