Эффективный способ проверить, находится ли текущая дата между двумя датами (годы не имеют значения)

На мой взгляд, мой ум пуст.

Я должен написать что-то, чтобы выяснить, какой диапазон дат на сегодняшний день сочетается с днем ​​и днем.

У меня есть определенное количество диапазонов дат, которые:

$dateRanges = array( 1 => "16 January to 30 April", 2 => "1 May to 30 June", 3 => "1 July to 15 August", 4 => "16 August to 15 September", 5 => "15 September to 15 October", 6 => "16 October to 15 January" ); 

Все, что я пытаюсь вернуть, это ключ массива диапазона, в который вписывается текущая дата.

На данный момент все, что проходит через мою голову, я должен будет настроить большую инструкцию if, чтобы посмотреть текущую date('j') и date('n') и сопоставить результаты. Но, конечно, это довольно грязно и не очень эффективно?

Любые идеи о лучшем способе подхода к этой проблеме будут высоко оценены!

 $today = time(); foreach ($dateRanges as $key => $range) { list($start, $end) = explode(' to ', $range); $start .= ' ' . date('Y'); // add 2011 to the string $end .= ' ' . date('Y'); if ((strtotime($start) <= $today) && (strtotime($end) >= $today)) { break; } } 

$ key будет либо индексом совпадающего диапазона дат, либо значением null / false.

Это вариант ответа Марка Б, но он стал более эффективным, превратив это в чистое числовое сравнение:

 function get_today () { $dateRanges = array( 0 => 116, // 16th Jan 1 => 501, // 1st May 2 => 701, // 1st July ..etc.. 3 => 816, 4 => 916, 5 => 1016 ); $today = (int) date('nd'); foreach ($dateRanges as $key => $date) { if ($today < $date) { $result = $key; break; } } return (empty($result)) ? 6 : $result; } 

Возвращает целое число, соответствующее ключам в вашем массиве образцов

Создайте экземпляры DateTime для значений в массиве и используйте простые операторы сравнения, такие как> и <

Просто используйте strtotime для создания эпохи UNIX, затем используйте встроенные операторы < и > .

http://www.php.net/manual/en/function.strtotime.php

 $time_min = strtotime("17 January 2011"); $time_max = strtotime("30 April 2011"); if ($time >= $time_min && $time < $time_max) { echo "Time is within range!"; } 

Затем вы можете просто расширить это, чтобы использовать массив заданных вами диапазонов.