Сравнение на времеви клейма в MySQL и PHP (UTC, +0000, часови зони)

Опитвам се да определя дали низ, който представлява датата и часа, даден в JSON емисия в Twitter, е в рамките на диапазон от колони с времеви клейма в MySQL.

Ето примерния низ:

'Sat, 31 Oct 2009 23:48:37 +0000',

+0000 според API ( created_at ) показва, че наистина е UTC. Сега използвам strtotime и date само за да потвърдя часа. с:

$t = 'Sat, 31 Oct 2009 23:48:37 +0000';
$timestamp = strtotime($t);

echo date('M d Y H:m:s', $timestamp);

Получавам Oct 31 2009 19:10:37. Ако премахна +0000, получавам Oct 31 2009 23:10:37. Така че разликата между това да имаш +0000 и да го нямаш е 4 часа. Предполагам, че поради моята местна часова зона (Мериленд, САЩ = America/New_York) и това очевидно се различава от UTC.

Не съм съвсем сигурен дали трябва да премахна +0000 или да го използвам, когато се опитвам да определя дали това времево клеймо е в обхвата на двете времеви клеймо, съхранени в моята база данни, които са 2009-10-30 23:16:38 и 2009-11-25 12:00:00. Чувствам се глупаво и малко объркан сега, когато попълних тези времеви отпечатъци, ГГГГ-ММ-ДД Ч:М:С дойде от инструмент за избор на дата и час на Javascript, примерен формат е 10/31/2009 11:40 am и използвам STR_TO_DATE така:

STR_TO_DATE("10/31/2009 11:40 am", "%m/%d/%Y %l:%i %p")'),

Да оставя ли +0000 или да го съблека? Психически потупвания


person meder omuraliev    schedule 01.11.2009    source източник


Отговори (2)


Разбира се, трябва да оставите информацията за часовата зона, при условие че правилно настройвате часовата зона на сървъра. В противен случай какъв е смисълът, всичките ви сравнения на време ще бъдат 4 часа почивка. :о)

За да сравните времето, трябва да го оставите като времево клеймо на UNIX, т.е. резултатът от strtotime.

$twitterTS    = strtotime('Sat, 31 Oct 2009 23:48:37 +0000');
$localStartTS = strtotime('Sat, 31 Oct 2009 19:00:00'); // timezone is -0400 implicitly
$localEndTS   = strtotime('Sat, 31 Oct 2009 20:00:00');

if ($localStartTS <= $twitterTS && $twitterTS <= $localEndTS) {
    // twitter timestamp is within range
}

За пояснение: Преди да сравнявате часове от различни часови зони, уверете се, че всички са преобразувани в една и съща часова зона. Сравняването на лондонското време 20:00 с нюйоркското време 20:00 без информация за часовата зона ще даде неправилни резултати. strtotime ще преобразува всички часове във вашата местна часова зона; ако информацията за часовата зона присъства във входа, тя ще я уважи и ще преобразува времето по подходящ начин, в противен случай ще приеме, че часът вече е локализиран. Ако всички времена във вашата база данни са локални, трябва да се уверите, че локализирате всички времеви клейма, които искате да сравните с тях.
Алтернативна стратегия би била винаги да конвертирате всички времена в UTC, преди да ги съхраните или сравните.

Направете своя избор, просто го правете последователно.

person deceze♦    schedule 01.11.2009

В PHP можете просто да използвате функцията substring, за да разбиете json twitter времето на неговите компоненти

//'Sat, 31 Oct 2009 23:48:37 +0000'
$hour = substring($jsontime,18,2);
$minute = substring($jsontime,22,2);
...

$phpDatetime mktime($hour,$minute,$second,$month,$day,$year);

Оттам нататък мисля, че вече го имате. Не забравяйте да коригирате разликите в GMT.

person UJ.    schedule 01.11.2009