Перебор дат в заданном диапазоне на php.
На днях возникла задача на перебор дат в заданном диапазоне на php. Точнее — нужно было создать функцию, которая на входе принимала дату (в двух вариантах: день, месяц, год или месяц и год), а на выходе выдавала все даты месяца, который принимался в качестве аргумента, начиная с первого дня месяца, либо же с заданного, если он передается функции.
Например, передается дата 09-12-2013. Функция должна создать массив с датами, начиная с 2013-12-09 по 2013-12-31. Если же передается дата без дня, например, 12-2013, то возвращается массив дат с 2013-12-01 по 2013-12-31.
Основная трудность — это наличие различного количества дней в месяцах, поэтому мы не можем просто задать цикл из 30 или 31-го дней. Должен быть учет всех этих вариаций и наличие 29-го февраля (раз в 4 года). Но решение оказалось простым. Вот, собственно говоря, сама функция:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
function getDatesArray($day = null, $month, $year) { //инициализируем массив, в котором будем сохранять даты $dates = array(); //определяем день старта if ($day) { $date = $year . '-' . $month . '-' . $day; } else { $date = $year . '-' . $month . '-01'; } //заполняем массив датами do { $dates[] = $date; echo $date . "<br>"; $date = date('Y-m-d', strtotime($date . ' + 1 days')); $currDateArr = explode('-', $date); } while ($month == $currDateArr[1]); } |
Для получения нового дня, используем простое выражение strtotime($date . ‘ + 1 days’). Выход из цикла осуществляется проверкой равенства месяца текущей (новой) даты и заданного месяца.
Если мы вызовем функцию со следующими аргументами:
1 |
getDatesArray('01', '10', '2013'); |
то получим даты:
2013-10-01
2013-10-02
2013-10-03
…
2013-10-31
Встроенные в php функции по форматированию даты сами определяют, сколько дней в том или ином месяце.
P.S. Если у вас есть вариант более лаконичный — пишите в комментариях:)
Категория: PHP-скрипты