Блог → date_diff: 27% неверных результатов

Недавно, я написал функцию для вычисления разности между двумя датами. Почитать об этом можно здесь. А спустя некоторое время, мне стало известно, что для этих целей в PHP 5.3 появилась встроенная функция date-diff. Сначала, я было расстроился, что потратил время на изобретение велосипеда, а затем решил проверить роботу этих двух функций. Моя идея заключалась в следующем. Генерировалось энное кол-во пар дат. Вычислялась разница между ними первым и вторым способом, а затем сравнивался результат.

Оказалось что в 27% случаев функцией date_diff возвращает неверный результат. Приведу несколько примеров.

2011-01-30 и 2011-03-1. Между этими датами прошел 1 месяц и 2 дня. Функция date_diff выдает 0 месяцев 30 дней.

1980-02-28 и 1981-09-2. Между этими датами прошел 1 год 6 месяцев и 3 дня. Функция date_diff выдает 1 год 6 месяцев 5 дней.

К сожалению, я не могу разместить здесь скрипт, которым пользовался для проверки, т.к. у меня на хостинге стоит PHP 5.2, но если кому интересно его можно скачать здесь.


Комментарии (5)

Волька
Хочу тебя огорчить, PHP функция date_diff правильно считает. Ошибка в твоей логике в том, что ты считаешь только дни между датами, требуется же захватывать один день: между 2011-01-30 и 2011-01-31 один день, между 2011-01-30 и 2011-03-01 30 дней.
Ответить
Savvateev
Вычитание проверяем сложением. 2011-01-30 плюс 2 дня равно 2011-02-1 плюс 1 месяц равно 2011-03-1. Итого 1 месяц 2 дня. Проблема в том, что помимо дней мы еще считаем и кол-во месяцев и в этом контексте между приведенными двумя датами 30 дней пройти просто не может, как не может пройти ровно 1 месяц. Например между 2011-01-1 и 2012-01-1 прошло 365 дней или 12 месяцев. Но в нашем контексте правильно сказать 1 год. Поэтому считать только одни дни неправильно. Между январем и мартом в принципе не может пройти 0 месяцев, ну ни как.
Ответить
Волька
Насчет интерпретации как считать, в днях или в месяцах, это спорный вопрос, смотря как кому удобнее. Я имел ввиду, что PHP правильно считает указанную разницу в 30 дней в первом примере. Правильный ответ будет - 30 дней, или 1 месяц и 2 дня, у нас ведь короткий месяц февраль в 28 дней - 28 + 2 = 30.
Ответить
Savvateev
Функция date_diff считает кол-во дней и кол-во месяцев!!! Поэтому правильный ответ 1 месяц 2 дня. Если бы она считала только кол-во дней тогда правильный ответ 30 дней.
Ответить
Волька
date_diff действительно неправильно считает некоторые даты, например, разницу 2011-01-30/2011-03-02 получим 1 месяц 0 дней, что абсурдно, ладно бы 31 день, однако 2011-04-02 уже будет 2 месяца 2 дня. Правильный ответ здесь в обоих случаях - n месяцев 2 дня, получается что на коротких интервалах дат функция ошибается.
Ответить


Оставить свой комментарий


Представтесь, пожалуйста *

Ваш комментарий

Число на картинке *

captcha

На хостинг