Сравнение меток времени в MySQL и PHP (UTC, +0000, часовые пояса) - PullRequest
4 голосов
/ 01 ноября 2009

Я пытаюсь определить, находится ли строка, которая представляет дату и время, заданную в фиде 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 , Теперь я чувствую себя глупо и немного смущенно, когда я заполнил эти временные метки YYYY-MM-DD H: M: S, полученный из средства выбора времени 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 или раздеть его? Мысленно выявляет

Ответы [ 2 ]

5 голосов
/ 01 ноября 2009

Вы, конечно, должны оставить информацию о часовом поясе, если вы также правильно устанавливаете часовой пояс сервера . Иначе в чем смысл, все ваши сравнения времени будут на 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 перед их сохранением или сравнением.

Сделайте свой выбор, просто делайте это последовательно.

0 голосов
/ 01 ноября 2009

В PHP вы можете просто использовать функцию подстроки, чтобы разбить время 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);

Оттуда я думаю, что у вас уже есть. Не забудьте скорректировать разницу по Гринвичу.

...