У меня есть определенный список дат. Я хочу получить первый понедельник каждого времени.
например: Предположим, что данные
2013-07-05 2013-08-05, 2013-09-13 etc.
Я хочу получить первый понедельник всех этих дней, чтобы результат
2013-07-01, 2013-08-05, 2013-09-02 respectively
Я фактически застрял в этом, используя stftime
.
strftime("%d/%m/%Y", strtotime("first Monday of July 2012"));
Использование класса php Datetime:
$Dates = array('2013-07-02', '2013-08-05', '2013-09-13'); foreach ($Dates as $Date) { $test = new DateTime($Date); echo $test->modify('first monday')->format('Ym-d'); }
<?php function find_the_first_monday($date) { $time = strtotime($date); $year = date('Y', $time); $month = date('m', $time); for($day = 1; $day <= 31; $day++) { $time = mktime(0, 0, 0, $month, $day, $year); if (date('N', $time) == 1) { return date('Ym-d', $time); } } } echo find_the_first_monday('2013-07-05'), "\n"; echo find_the_first_monday('2013-08-05'), "\n"; echo find_the_first_monday('2013-09-13'), "\n"; // output: // 2013-07-01 // 2013-08-05 // 2013-09-02
первый понедельник будет в течение первых 7 дней месяца, DAYOFWEEK(date)
возвращает 1 = воскресенье, 2 = понедельник и т. д.
также см. взлом # 23 http://oreilly.com/catalog/sqlhks/chapter/ch04.pdf
Вы можете пройти через массив дат, а затем выйти из цикла и вернуть $Date
когда вы впервые встретите понедельник
PHPFIDDLE
$Dates = array('2013-07-02', '2013-08-05', '2013-09-13'); foreach ($Dates as $Date) { $weekday = date('l', strtotime($Date)); if($weekday == 'Monday') { echo "First Monday in list is - " . $Date; break; } }
Вывод
First Monday in list is - 2013-08-05