Получить выходные дни в php - PullRequest
8 голосов
/ 28 июля 2010

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

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

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

Sunil

Ответы [ 5 ]

11 голосов
/ 28 июля 2010

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

$now = strtotime("now");
$end_date = strtotime("+3 weeks");

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

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

6 голосов
/ 28 июля 2010

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

3 голосов
/ 28 июля 2010
$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("Y-m-d");
    $d = $d->add($oneday);
    if ($d->getTimestamp() <= $endTimestamp) {
        $res[] = $d->format("Y-m-d");
    }
    $d = $d->add($sixdays);
}

Пример с

$end = new DateTime("2010-08-20");
$endTimestamp = $end->getTimestamp();
array(6) {
  [0]=>
  string(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"
}
0 голосов
/ 13 мая 2016

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

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

0 голосов
/ 28 июля 2010

Это не очень хорошо проверено, но, кажется, работает достаточно хорошо. Обратите внимание, что если $ 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";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...