Перебор дат в заданном диапазоне на 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-скрипты

Оставить комментарий