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

Похоже, у меня сходит с ума по этому вопросу.

Мне нужно написать кое-что, чтобы выяснить, к какому диапазону дат подходит сегодняшняя комбинация день / месяц.

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

  $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') и сопоставить результаты.Но, конечно, это довольно грязно и не очень эффективно?

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

Ответы [ 4 ]

5 голосов
/ 03 ноября 2011
$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;
   }
}

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

2 голосов
/ 03 ноября 2011

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

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;
}

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

0 голосов
/ 03 ноября 2011

Просто используйте 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!";
}

Затем вы можете просто развернутьэто использовать указанный вами массив диапазонов.

0 голосов
/ 03 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...