Разница дат

Разница дат

День добрый!

Подскажите пожалуйста, как при наличии двух дат вычислить разницу между ними в годах, месяцах и днях.
Причем желательно учитывать что в месяцах бывает не только 30 дней.
Тоесть, между 28 февраля 2006 года и 28 марта 2006 года разница в месяц, а не в 28 дней,
а между 28 февраля 2006 года и 1 апреля 2006 года разница 1 месяц 4 дня, а не 2 месяца (если смотреть разницу месяцев).
 

donflash

Вареник клуба
[m]time[/m]
[m]date[/m]
[m]strtotime[/m]

-~{}~ 31.08.06 17:24:

Допустим есть первая дата -> 27.06.2006 и вторая -> 28.02.2010. Что делаем? Переводим в Unix timestamp, с помощью [m]strtotime[/m], обе даты. Дальше из большей вычитаешь меньшую и делаешь анализ с помощью ф-ии [m]date[/m] или [m]getdate[/m]

P.s. это одно из возможных действий (первое, что на ум пришло)
 

Гном

Новичок
Re: Разница дат

Автор оригинала: Смирнов Андрей
День добрый!

Подскажите пожалуйста, как при наличии двух дат вычислить разницу между ними в годах, месяцах и днях.
Причем желательно учитывать что в месяцах бывает не только 30 дней.
Тоесть, между 28 февраля 2006 года и 28 марта 2006 года разница в месяц, а не в 28 дней,
а между 28 февраля 2006 года и 1 апреля 2006 года разница 1 месяц 4 дня, а не 2 месяца (если смотреть разницу месяцев).
В какой то книжке было вот такое
PHP:
// 7:32:56 pm 10 мая 1965 года
$epoch_1 = mktime(19,32,56,5,10,1965);
// 4:29:11 am 20 ноября 1962 года
$epoch_2 = mktime(4,29,11,11,20,1962);

$diff_seconds     =    $epoch_1 - $epoch_2;
$diff_weeks     =    floor($diff_seconds/604800);
$diff_seconds    -=    $diff_weeks * 604800;
$diff_days        =    floor($diff_seconds/86400);
$diff_seconds    -=    $diff_days * 86400;
$diff_hours        =    floor($diff_seconds/3600);
$diff_seconds    -=    $diff_hours * 3600;
$diff_minutes    =    floor($diff_seconds/60);
$diff_seconds    -=    $diff_minutes * 60;

print "The two dates have $diff_weeks weeks, $diff_days days, ";
print "$diff_hours hours, $diff_minutes minutes, and $diff_seconds ";
print "seconds elapsed between them. ";

//The two dates have 128 weeks, 6 days, 14 hours, 3 minutes, and 45 seconds elapsed between them
 

phprus

Moderator
Команда форума
Класс, предназначенный для формирования словестного представления разности между двумя датами в формате Unix timestamp. Корректно учитываются падежи слов. Пример применения можно увидеть в заголовке сообщений этого форума.

Архив называется Date_DeltaRussian.zip (Автор Дмитрий Котеров)

Скачать можно сдесь:
http://forum.dklab.ru/php/advises/TransformationOfADifferenceBetweenTwoUnixTimeAtLine.html
 
2 donflash и Гном:
В ваших предложениях все хорошо, за исключением что в месяцах не всегда 30 дней, и даже не 30,5, как в обсуждении http://forum.dklab.ru/php/advises/TransformationOfADifferenceBetweenTwoUnixTimeAtLine.html

Наиболее верное решение:
Автор оригинала: phprus
Класс, предназначенный для формирования словестного представления разности между двумя датами в формате Unix timestamp. Корректно учитываются падежи слов. Пример применения можно увидеть в заголовке сообщений этого форума.
Архив называется Date_DeltaRussian.zip (Автор Дмитрий Котеров)
Скачать можно сдесь:
http://forum.dklab.ru/php/advises/TransformationOfADifferenceBetweenTwoUnixTimeAtLine.html
Но и в предлагаемом классе имеется спорный момент:

PHP:
// Delta day. Is negative, month overlapping.
		$dDay += $l['mday'] - $f['mday'];
		if ($dDay < 0) {
			$monlen = Date_DeltaRussian::monthLength(date("Y", $first), date("m", $first));
			$dDay += $monlen;
			$dMon--;
		}
		$delta['mday'] = $dDay;
Высчитывается количество дней в стартовом месяце, хотя может правильнее учитывать количество дней в месяце предшествующем последнему?
Ваше мнение?
 
Сверху