Юзать ее имеет смысл при отсутствии DateTime::diff()
У функции есть недостаток - присутствует погрешность прямо пропорциональная разнице между датами. Связано это с "усреднением" коэффициентов при вычислении.
Собственно, вот:
/**
* Функция вычисления разницы между одной датой и/или временем и другой.
* Костыль для серверов с отсутствующим DateTime либо версией PHP < 5.3.0
*
* @author Invis1ble
* @copyright 2011, Invis1ble
* @version 1.0
* @since 15.08.2011
*
* @param string $datetime1 дата и/или время
* @param string $datetime2 дата и/или время
* @return mixed Ассоциативный массив с результатами или false в случае ошибки
* (при некорректном формате входных значений)
*
* @todo исправить, по возможности, погрешность в вычислениях
*/
function dateDiff($datetime1, $datetime2)
{
if (($t1 = strtotime(str_replace('/', '.', $datetime1))) && $t2 = strtotime(str_replace('/', '.', $datetime2)))
{
$td = abs($t1 - $t2);
$y = floor($td / 31557600);
$m = floor(($td - $y * 31557600) / 2629800);
$d = floor(($td - $y * 31557600 - $m * 2629800) / 86400);
$h = floor(($td - $y * 31557600 - $m * 2629800 - $d * 86400) / 3600);
$min = floor(($td - $y * 31557600 - $m * 2629800 - $d * 86400 - $h * 3600) / 60);
return array(
'years' => $y,
'months' => $m,
'days' => $d,
'hours' => $h,
'minutes' => $min,
'seconds' => $td - $y * 31557600 - $m * 2629800 - $d * 86400 - $h * 3600 - $min * 60
);
}
return false;
}
Пример использования прост. Вызываем функцию с аргументами в формате, идентичном формату ф-ции date().
$datetime1 = '10.07.2010 08:20:05';
$datetime2 = date('d.m.Y H:i:s');
$interval = dateDiff($datetime1, $datetime2);
var_dump($interval);
Замечания, пожелания и конструктивная критика как всегда приветствуются.
Спустя 4 дня, 7 часов, 20 минут, 52 секунды (19.08.2011 - 18:45) webwindows написал(а):
а высокостные года? и даты лучше всего сравнивать ГГГГ.ММ.ДД
Спустя 2 часа, 27 минут, 36 секунд (19.08.2011 - 21:12) Invis1ble написал(а):
webwindows
Цитата |
а высокостные года? |
ответ:
Цитата |
У функции есть недостаток - присутствует погрешность прямо пропорциональная разнице между датами |
Цитата |
и даты лучше всего сравнивать ГГГГ.ММ.ДД |
ответ:
Цитата |
Вызываем функцию с аргументами в формате, идентичном формату ф-ции date(). |
Спустя 1 день, 1 час, 42 минуты, 3 секунды (20.08.2011 - 22:54) Guest написал(а):
Invis1ble можно сделать и так:
function dateDiff($startDay, $endDay) {
$endDay = strtotime($endDay);
$startDay = strtotime($startDay);
$difference = abs($endDay - $startDay);
$return['days'] = floor($difference / 86400);
$return['hours'] = floor($difference / 3600) % 24;
$return['minutes'] = floor($difference / 60) % 60;
return $return;
}
Спустя 5 минут, 17 секунд (20.08.2011 - 23:00) Invis1ble написал(а):
Guest
можно по-всякому сделать, а протестировать ф-цию не судьба перед тем как выкладывать код?
Это по сути обрубленная версия моей ф-ции
ПС. Было бы намного инересней увидеть решение работающее без погрешностей
можно по-всякому сделать, а протестировать ф-цию не судьба перед тем как выкладывать код?
Это по сути обрубленная версия моей ф-ции
ПС. Было бы намного инересней увидеть решение работающее без погрешностей
Спустя 2 минуты, 42 секунды (20.08.2011 - 23:02) Guest написал(а):
Guest брррр. А тебе было лень протестить? Если не знаешь как, советую запустить так:
Я выдрал из своих скриптов, которые работают с БД, и переделывать не буду. Я лишь дал упращенный вариант твоих вычислений.
print_r( dateDiff('21-07-2011 01:16','28-07-2011 05:16') );
Я выдрал из своих скриптов, которые работают с БД, и переделывать не буду. Я лишь дал упращенный вариант твоих вычислений.
Спустя 4 минуты, 19 секунд (20.08.2011 - 23:07) Invis1ble написал(а):
Guest
мне не лень, я протестил перед тем, как писать пост. Результат без месяцев и лет. В чем прикол? В % ? Ну это да, оптимизация, спасибо.
мне не лень, я протестил перед тем, как писать пост. Результат без месяцев и лет. В чем прикол? В % ? Ну это да, оптимизация, спасибо.
Спустя 8 часов, 13 минут, 6 секунд (21.08.2011 - 07:20) kirik написал(а):
Цитата (Invis1ble @ 15.08.2011 - 04:24) |
Замечания, пожелания и конструктивная критика как всегда приветствуются. |
Это конечно зависит от использования, но мне кажется имеет смысл ещё возвращать разницу в указанных еденицах (третьим параметром). Например если у нас получилось в результате 6 месяцев разницы, а результат запросили в годах, то вернуть 0.5. А если третий параметр не указали, то возвращать как есть у тебя.
_____________
Профессиональная разработка на заказ
Я на GitHub | второй профиль