Místo toho, abyste si pohrávali s časovými pásmy, proč to prostě neudělat
ALTER TABLE `your_table`
CHANGE `date_added` `date_added`
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
To se změní váš sloupec ze sloupce DATE do sloupce TIMESTAMP , čímž se všechna data v procesu převedou na jejich příslušná časová razítka UTC.
Když je vložen nový řádek, použije aktuální časové razítko jako hodnotu . Časová razítka jsou vždy v UTC, takže nemusíte měnit časové pásmo na serveru MySql ani zadávat datum při vkládání nového řádku.
Pokud nemůžete nebo nechcete změnit své sloupce, můžete také vybrat časové razítko pomocí
SELECT UNIX_TIMESTAMP('date_added') FROM your_table;
Pro váš TimeAgo pak stačí udělat
$now = new DateTime;
$dateAdded = new DateTime("@$yourTimestampFromDb");
$dateAdded->setTimezone($now->getTimezone());
$timeSinceAdded = $dateAdded->diff($now);
Když do DateTime zadáte časové razítko, bude vždy používat UTC bez ohledu na výchozí časové pásmo vašeho serveru. Následně musíte buď převést $dateAdded
na výchozí časové pásmo (jak je uvedeno výše) nebo převeďte $timeSinceAdded
do UTC.
Chcete-li změnit datum a čas na časové pásmo aktuálně navštěvujícího uživatele, buď
- potřebujete mít tyto informace ve své databázi, např. protože žádáte registrované uživatele o poskytnutí těchto informací
- nebo určíte to za běhu, obvykle vyhledáním GeoIP na IP návštěvníka uživatele nebo odesláním posunu DateTime Offset z prohlížeče uživatele.
V každém případě pak stačí změnit oba DateTimes na toto časové pásmo. To lze snadno provést pomocí setTimezone()
.
$timeSinceAdded
bude pak DateInterval
objekt, který můžete použít takto
echo $timeSinceAdded->format('%a total days');
Další podrobnosti, například o dostupných modifikátorech formátu, naleznete v odkazech.