Вместо да се занимавате с часовите зони, защо просто не го направите
ALTER TABLE `your_table`
CHANGE `date_added` `date_added`
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
Това ще се промени вашата колона от колона DATE в колона TIMESTAMP , преобразувайки всички дати в съответните им времеви марки по UTC в процеса.
Когато се вмъкне нов ред, той ще използва текущото времеви печат като стойност . Отпечатъците за време винаги са в UTC, така че не е нужно да променяте часовата зона на вашия MySql сървър, нито да предоставяте датата при вмъкване на нов ред.
Ако не можете или не искате да промените колоните си, можете също така просто да изберете времевата марка чрез
SELECT UNIX_TIMESTAMP('date_added') FROM your_table;
За своя TimeAgo можете просто да го направите
$now = new DateTime;
$dateAdded = new DateTime("@$yourTimestampFromDb");
$dateAdded->setTimezone($now->getTimezone());
$timeSinceAdded = $dateAdded->diff($now);
Когато предоставите времева марка на DateTime, тя винаги ще използва UTC, независимо от зададената часова зона на вашия сървър по подразбиране. Следователно, трябва или да конвертирате $dateAdded
към часова зона по подразбиране (както е показано по-горе) или конвертирайте $timeSinceAdded
до UTC.
За да промените dateTime към часовата зона на посещаващия в момента потребител, или
- трябва да имате тази информация във вашата база данни, напр. защото молите регистрирани потребители да предоставят тази информация
- или вие го определяте по време на изпълнение, обикновено като правите GeoIP търсене на IP на посещаващия потребител или чрез изпращане на изместване на дата и час от браузъра на потребителя.
Във всеки случай, вие просто променяте и двете DateTimes към тази часова зона. Това се прави лесно чрез setTimezone()
.
$timeSinceAdded
тогава ще бъде DateInterval
обект, който можете да използвате по този начин
echo $timeSinceAdded->format('%a total days');
Моля, вижте връзките за повече подробности, например относно наличните модификатори на формат.