Количество пересечений между двумя диапазонами дат

1

У меня есть 2 диапазона дат в приложении Codeigniter, и я хочу рассчитать количество дней, которые пересекаются между этими диапазонами. есть идеи?

Date1start = YYYY-MM-DD; Date1end = YYYY-MM-DD;

Date2start = YYYY-MM-DD; Date2end = YYYY-MM-DD;

  • 1
    « количество дней, которое пересекается между этими диапазонами » - не могли бы вы объяснить, что это значит?
  • 1
    Что вы пробовали? Можете ли вы показать нам свой код, пожалуйста? @AmalMurali он хочет знать, сколько дней принадлежит обоим диапазонам дат.
Показать ещё 2 комментария
Теги:
codeigniter
date
range

2 ответа

1
Лучший ответ

Что-то вроде этого должно работать

$datetimeStart1 = new DateTime('2015-12-10');
$datetimeEnd1 = new DateTime('2015-12-20');

$datetimeStart2 = new DateTime('2015-12-12');
$datetimeEnd2 = new DateTime('2015-12-28');

// following http://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-overlap
if ($datetimeStart1 < $datetimeEnd2 && $datetimeEnd1 > $datetimeStart2) {
    echo min($datetimeEnd1,$datetimeEnd2)->diff(max($datetimeStart2,$datetimeStart1))->days+1;
} else {
    echo 'no overlap';
}

Демо: http://3v4l.org/9Pecb

Только для PHP 5.2

$datetimeStart1 = new DateTime('2015-12-10');
$datetimeStart1 = $datetimeStart1->format('U');
$datetimeEnd1 = new DateTime('2015-12-20');
$datetimeEnd1 = $datetimeEnd1->format('U');

$datetimeStart2 = new DateTime('2015-12-12');
$datetimeStart2 = $datetimeStart2->format('U');
$datetimeEnd2 = new DateTime('2015-12-28');
$datetimeEnd2 = $datetimeEnd2->format('U');

// following http://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-overlap
if ($datetimeStart1 < $datetimeEnd2 && $datetimeEnd1 > $datetimeStart2) {
    echo round(
        ((min($datetimeEnd1,$datetimeEnd2)) - (max($datetimeStart2,$datetimeStart1))) / (60*60*24)) + 1;
} else {
    echo 'no overlap';
}

Демо: http://3v4l.org/a1WLk

  • 0
    спасибо за ответ, я попробовал ваш код и получил ошибку (вызов неопределенного метода DateTime :: diff ()).
  • 0
    Какую версию php вы используете? = <5,2?
Показать ещё 3 комментария
3

Напиши это легко:

$datetimeStart1 = new DateTime('2015-12-10');
$datetimeEnd1 = new DateTime('2015-12-20');

$datetimeStart2 = new DateTime('2015-12-12');
$datetimeEnd2 = new DateTime('2015-12-28');

$start = max($datetimeStart2,$datetimeStart1);
$end = min($datetimeEnd1,$datetimeEnd2);
echo $end >= $start ? $end->diff($start)->days+1 : "no overlap";

Ещё вопросы

Сообщество Overcoder
Наверх
Меню