2010-07-28 27 views
7

Estoy trabajando en una aplicación php que requiere que extraiga las fechas de los fines de semana entre dos fechas y luego las inserte como registros únicos en la base de datos mysql.Obtener fechas de fin de semana en php

Estaba pensando si había una manera más sencilla de hacerlo, en lugar de ir a través del lazo entre la fecha de inicio y de finalización y para cada fecha de comprobar si date('l', strtotime($date)) devuelve "Sábado" o "Domingo"

Gracias por su tiempo

Sunil

+7

Solo quería comentar que la probabilidad de obtener fechas de fin de semana usando PHP es casi nula; o) - waka waka waka. Ahora veré qué puedo hacer con una respuesta para ti. ¿En qué formato son las 2 fechas - UNIX preferible? – Tim

+0

Batirme a la broma, allí, Tim ... – DGM

Respuesta

11

Si está utilizando una instalación anterior de PHP (o no tiene la clase 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"); 
} 

Nos bucle a través el rango de fechas y verifique si el día es 0 o 6 (domingo o sábado).

+0

Gracias. Convertí startdate a time y usé la función anterior 'while (date ("Ymd", $ start_date)! = 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 (date ("Y-m-d", $ start_date). "+1 día"); } ' –

6

bien el php Fecha ("N") que da el día de la semana, siendo 1 el lunes y 7 era domingo por lo que podría poner en práctica esto en una sentencia if con bastante facilidad.

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); 
} 

Ejemplo con

$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

Esto no está bien probado, pero parece funcionar bastante bien. Tenga en cuenta que si $ start es en un fin de semana y $ end es el mismo día de la semana pero antes, la fecha representada por $ end se omitirá; por lo tanto, las marcas de tiempo deberían ser idealmente a la medianoche.

<?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

¿Por qué no utilizar 'strtotime'? ¿Qué pasa si haces un error ortográfico en tus números mágicos? –

+0

Más importante aún, ¿qué sucede si hay un cambio de horario de verano ... – Artefacto

+0

Supongo que estaba asumiendo que las marcas de tiempo serían todas UTC, para evitar tales problemas. – Fraxtil

0

Para cualquier otra persona que se encuentra esta - He utilizado el siguiente:

$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; 
    } 
} 

enmendar a su propio rango de inicio y final de margen y en lugar de formato de sólo el d en $ obligatorio - que podría hacer d/m/Y para una fecha más sustancial.

Cuestiones relacionadas