[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вычисление разницы между двумя датами
Invis1ble
Написал функцию для вычисления разницы между одной датой и другой.
Юзать ее имеет смысл при отсутствии 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 | второй профиль

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.