2010-07-28 2 views
7

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

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

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

Сунил

+7

Просто хотел прокомментировать, что вероятность получения дат выходных дней с использованием PHP ничтожно мала, o) - waka waka waka. Теперь я посмотрю, что я могу сделать для вас. В каком формате указаны 2 даты - предпочтительнее UNIX? – Tim

+0

Ударь меня в шутку, там, Тим ... – DGM

ответ

11

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

+0

Спасибо. Я преобразовал начальную дату во время и использовал указанную выше функцию 'while (date ("Ymd", $ start_date)! = Дата ("Ymd", $ end_date)) { \t $ day_index = date ("w", $ start_date); \t if ($ day_index == 0 || $ day_index == 6) { \t echo date ('Y-m-d', $ start_date). "
"; } \t $ start_date = strtotime (дата («Y-m-d», $ start_date). «+1 день»); } ' –

6

Ну PHP Дата («N») дает день недели с 1 будучи в понедельник и 7 быть в воскресенье, так что вы могли бы осуществить, что в если заявление довольно легко.

3
$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

Это не проверено, но, похоже, оно работает достаточно хорошо. Обратите внимание, что если $ 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

Почему бы не использовать 'strtotime'? Что произойдет, если вы сделаете опечатку в своих магических числах? –

+0

Что еще более важно, что произойдет, если есть изменение DST ... – Artefacto

+0

Я предполагаю, что все временные метки были UTC, чтобы избежать таких проблем. – Fraxtil

0

Для любого другого, что находит это - я использовал следующее:

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

Смежные вопросы