Узнайте, существует ли дата между двумя датами, игнорируя год

Мне нужно определить, существует ли дата (месяц и день) между двумя другими месяцами / днями.

Я прикрепил изображение к этому сообщению, которое описывает то, что я пытаюсь сделать. В основном пример «текущий день» выделен красным цветом, и он находится между этими ближайшими датами (15 марта и 22 ноября). Однако, когда я использую временные метки Unix и искусственно добавляю год к датам, сценарий считает, что 22 ноября еще не произошло, и поэтому он предлагает, чтобы 1 февраля было до 15 марта и 22 ноября, а не между ними. Итак, мне нужно сравнивать даты, не используя год.

Надеюсь, это имеет смысл. Я просто хотел бы сравнить даты, используя месяцы и дни, но игнорируя год, и используя фреймворк, такой как колесо, я показываю на изображении.

Определите, существует ли дата между двумя датами

Solutions Collecting From Web of "Узнайте, существует ли дата между двумя датами, игнорируя год"

Проблема в вашем примере состоит в том, что (в том же году) верхняя граничная дата находится перед нижней границей. В этом случае любая дата, меньшая чем верхняя граница (1 января – 14 марта) или выше нижней границы (23 ноября – 31 декабря), находится между ними.

<?php $upperBound = new DateTime("Mar 15"); $lowerBound = new DateTime("Nov 22"); $checkDate = new DateTime("Feb 1"); if ($lowerBound < $upperBound) { $between = $lowerBound < $checkDate && $checkDate < $upperBound; } else { $between = $checkDate < $upperBound || $checkDate > $lowerBound; } var_dump($between); ?> 

Отображает: boolean true

редактировать

Если дата, которую вы хотите проверить, – «29 февраля», а текущий год не является високосным годом, тогда DateTime интерпретирует ее как «Март 1».

Чтобы проверить, существует ли дата между двумя датами, включительно, используйте:

 if ($lowerBound < $upperBound) { $between = $lowerBound <= $checkDate && $checkDate <= $upperBound; } else { $between = $checkDate <= $upperBound || $checkDate >= $lowerBound; } 

Чтобы решить эту проблему, вы можете конвертировать свои даты в 4-значный номер формы MMDD.

 $start = '1122'; $end = '0315'; $date = '0201'; 

Если у вас еще нет ваших дат, отформатированных таким образом, вы можете использовать date('md', $timestamp) или просто вычислить число, взяв $month * 100 + $day ;

Тогда ваша тестовая логика изменится в зависимости от того, пересекаете ли вы границу года или нет. Соединяя все это, это может выглядеть так:

 function isDateBetween($testM, $testD, $startM, $startD, $endM, $endD) { $start = $startM*100 + $startD; $end = $endM*100 + $endD; $date = $testM*100 + $testD; if ($start > $end) { // crossing a year boundary return ($date > $start) || ($date < $end); } else { // not crossing a year return ($date > $start) && ($date < $end); } } 

Вот несколько примеров вызова этой функции:

 // your example given above isDateBetween(2, 1, 11, 22, 3, 15); // true // ends the day after instead isDateBetween(3, 16, 11, 22, 3, 15); // false // reverse the dates in your example isDateBetween(2, 1, 3, 15, 11, 22); // false // ends the day after, with reversed dates isDateBetween(3, 16, 3, 15, 11, 22); // true 

Попробуй вот так.

 <?php $check_date= strtotime("31-Aug-1990"); $start_date= strtotime("10-Aug-2013"); $end_date= strtotime("30-Aug-1990"); if (date("Md", $check_date)>date("Md", $start_date) && date("Md", $check_date)<date("Md", $end_date)) echo "in the range"; else echo "not in the range"; 

Рабочий код здесь

 //must be 2 digit month, then 2 digit day, like mm-dd $low = '03-15'; $high = '11-22'; $date = '02-01'; $isBetween = $date >= $low && $date <= $high; var_dump($isBetween); 

Я использую лексикографическое упорядочение, так как php сравнивает строки. Ключевой момент состоит в том, чтобы поместить наибольшие единицы слева (месяцы) и следить за тем, чтобы каждый цифровой сегмент оставил одну и ту же длину, используя нули для прокладки.

Если у вас еще нет ваших дат в виде строк, отформатированных таким образом, вы можете использовать функцию date('m-d', $timestamp) для достижения этой цели.