Получите Даты Выходных дней в php

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

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

Спасибо за внимание

Sunil

8
задан Sunil Shenoy 28 July 2010 в 03:58
поделиться

4 ответа

Если вы используете старую установку 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 (воскресенье или суббота).

12
ответ дан 5 December 2019 в 07:56
поделиться
$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"
}
3
ответ дан 5 December 2019 в 07:56
поделиться

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

6
ответ дан 5 December 2019 в 07:56
поделиться

Это не очень хорошо протестировано, но, похоже, работает достаточно хорошо. Обратите внимание, что если $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";
}
0
ответ дан 5 December 2019 в 07:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: