I stedet for at rode med tidszoner, hvorfor ikke bare gøre det
ALTER TABLE `your_table`
CHANGE `date_added` `date_added`
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
Dette ændres din kolonne fra en DATE-kolonne til en TIMESTAMP-kolonne , der konverterer alle datoerne til deres respektive UTC-tidsstempler i processen.
Når en ny række er indsat, bruger den det aktuelle tidsstempel som en værdi . Tidsstempler er altid i UTC, så du behøver ikke at ændre tidszonen på din MySql-server eller angive datoen, når du indsætter en ny række.
Hvis du ikke kan eller ønsker ikke at ændre dine kolonner, kan du også bare vælge tidsstemplet via
SELECT UNIX_TIMESTAMP('date_added') FROM your_table;
For din TimeAgo kan du så bare gøre
$now = new DateTime;
$dateAdded = new DateTime("@$yourTimestampFromDb");
$dateAdded->setTimezone($now->getTimezone());
$timeSinceAdded = $dateAdded->diff($now);
Når du angiver et tidsstempel til DateTime, vil det altid bruge UTC uanset din standardservertidszone. Derfor skal du enten konvertere $dateAdded
til standardtidszonen (som vist ovenfor) eller konverter $timeSinceAdded
til UTC.
For at ændre dateTime til den aktuelt besøgende brugers tidszone, skal du enten
- skal have disse oplysninger i din database, f.eks. fordi du beder registrerede brugere om at give disse oplysninger
- eller du bestemmer det under kørsel, normalt ved at lave et GeoIP-opslag på den besøgende brugers IP eller ved at sende DateTime Offset fra brugerens browser.
Under alle omstændigheder ændrer du bare begge DateTimes til den tidszone. Dette gøres nemt via setTimezone()
.
$timeSinceAdded
vil så være et DateInterval
objekt, som du kan bruge sådan her
echo $timeSinceAdded->format('%a total days');
Se venligst linkene for yderligere detaljer, for eksempel om de tilgængelige formatmodifikatorer.