Получить выходные дни в php

Я работаю над php-приложением, которое требует, чтобы я извлекал даты выходных дней между двумя датами, а затем вставлял их как отдельные записи в базу данных mysql.

Я думал, был ли более простой способ сделать это, а не проходить через цикл между датой начала и датой окончания и для каждой даты, проверяющей, будет ли date('l', strtotime($date)) возвращать «субботу» или «воскресенье» "

Спасибо за ваше время

Сунил

Если вы используете более старую установку PHP (или не имеете класс DateTime):

 $now = strtotime("now"); $end_date = strtotime("+3 weeks"); while (date("Ymd", $now) != date("Ymd", $end_date)) { $day_index = date("w", $now); if ($day_index == 0 || $day_index == 6) { // Print or store the weekends here } $now = strtotime(date("Ymd", $now) . "+1 day"); } 

Мы просматриваем диапазон дат и проверяем, является ли день индексом 0 или 6 (воскресенье или суббота).

Ну, php Date («N») дает вам день недели, когда 1 – понедельник, а 7 – воскресенье, поэтому вы можете легко реализовать это в инструкции if.

 $now = new DateTime("now"); $now->setTime(0,0); if (($now->format("l") == "Saturday") || ($now->format("l") == "Sunday")) $d = $now; else $d = new DateTime("next saturday"); $oneday = new DateInterval("P1D"); $sixdays = new DateInterval("P6D"); $res = array(); while ($d->getTimestamp() <= $endTimestamp) { $res[] = $d->format("Ymd"); $d = $d->add($oneday); if ($d->getTimestamp() <= $endTimestamp) { $res[] = $d->format("Ymd"); } $d = $d->add($sixdays); } 

Пример с

 $end = new DateTime("2010-08-20"); $endTimestamp = $end->getTimestamp(); 
 array (6) {
   [0] =>
   строка (10) "2010-07-31"
   [1] =>
   string (10) "2010-08-01"
   [2] =>
   string (10) "2010-08-07"
   [3] =>
   string (10) "2010-08-08"
   [4] =>
   string (10) "2010-08-14"
   [5] =>
   string (10) "2010-08-15"
 }

Это не проверено, но, похоже, оно работает достаточно хорошо. Обратите внимание, что если $ start находится в выходные, а $ end – в тот же день недели, но раньше, дата, обозначенная $ end, будет опущена, поэтому метки времени должны идеально быть в полночь.

 <?php $start = $now = 1280293200; // starting time $end = 1283014799; // ending time $day = intval(date("N", $now)); $weekends = array(); if ($day < 6) { $now += (6 - $day) * 86400; } while ($now <= $end) { $day = intval(date("N", $now)); if ($day == 6) { $weekends[] += $now; $now += 86400; } elseif ($day == 7) { $weekends[] += $now; $now += 518400; } } echo "Weekends from " . date("r", $start) . " to " . date("r", $end) . ":\n"; foreach ($weekends as $timestamp) { echo date("r", $timestamp) . "\n"; } 

Для тех, кто это находит, я использовал следующее:

 $start = new DateTime($this->year.'-'.$month.'-01'); $interval = new DateInterval('P1D'); $end = new DateTime($this->year.'-'.$month.'-31'); $period = new DatePeriod($start,$interval,$end); foreach ($period as $day){ if ($day->format('N') == 6 || $day->format('N') == 7){ $compulsory[$day->format('d')] = true; } } 

Измените свой собственный диапазон начала и конца и вместо того, чтобы форматировать только d в $ обязательный – вы могли бы сделать d / m / Y для более существенной даты.