Я работаю над 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 для более существенной даты.