Работа с датой в программировании - одна из самых нудных задач. Потому что существует множество форматов даты. Начиная от православного "день.месяц.год", заканчивая неадекватным американским форматом "месяц-день-год". Приведу паку примеров наиболее востребованных функций для работы с датой в PHP.
Вывод текущей даты
Функция для вывода даты date() может выводить дату в различных форматах. Один из наиболее популярных у меня: "день.месяц.год час:минута:секунда". Чтобы вывести дату в таком формате необходимо передать функции дате такую строку:
$d = date('d.m.Y H:i:s');
В переменной $d окажется дата формата: "24.07.2017 15:28:11".
Полное описание всех значков в строке смотрите в этой таблице:
Добавить к текущей дате день/неделю/месяц/год
Чтобы добавить/отнять от текущей даты дни/месяцы/недели, можно использовать такую конструкцию:
$d = date('d.m.Y H:i:s', strtotime(date('Y-m-d H:i:s') . ' +1 day'));
$d = date('d.m.Y H:i:s', strtotime(date('Y-m-d H:i:s') . ' -1 week'));
$d = date('d.m.Y H:i:s', strtotime(date('Y-m-d H:i:s') . ' +1 year'));
Во втором аргументе функции стоят "+1 day", "-1 week" и т.п. Они изменяют дату, добавляя/отнимая разные периоды. Их возможные значения: year, month, week, days, hours, seconds.
Чтобы выводимый формат соответствовал нуждам, измените его в первом аргументе 'd.m.Y H:i:s'.
Можно добавлять сразу несколько периодов одновременно:
$d = date('d.m.Y', strtotime(date('Y-m-d') . ' +1 year 1 week 2 days'));
Получить прошлый понедельник
В PHP можно легко получить дату прошлого или этого понедельника. Для этого существует класс DateTime.
$date = new DateTime('monday this week');
$thismonday = $date->format('d.m.Y');
Такая конструкция присвоит переменной $thismonday дату понедельника на этой неделе. Чтобы получить дату понедельника на прошлой неделе, необходимо 'monday this week' заменить на 'monday last week'.
Получить все понедельники между датами
Иногда необходимо получить все понедельники между двумя датами. В этой задаче поможет класс DatePeriod и DateInterval в сочетании с хитростью форматирования даты. Разберём на примере.
Cделаем цикл для получения всех понедельников между двумя заданными:
$start = new DateTime('03.07.2017'); // первый понедельник месяца
$end = new DateTime('31.07.2017'); // последний понедельник месяца
$interval = DateInterval::createFromDateString('7 day');
$daterange = new DatePeriod($start, $interval, $end);
foreach ($daterange as $dt){if ($dt->format('N') == 1){
echo $dt->format('d.m.Y') . '<br>';
}
}
Здесь $dt->format('N') даёт порядковый номер дня недели. Для понедельников это "1".