2010-10-28 13 views
8

Estoy tratando de usar PHP para crear un script que busque todos los días entre ahora y un año y enumere todas las fechas para viernes y sábados. Estaba tratando de usar las funciones date() y mktime() de PHP, pero no puedo pensar en una forma de hacerlo. ¿Es posible?¿Cómo puedo usar PHP para listar todas las fechas en un año?

Gracias, Ben

Respuesta

9

He aquí cómo hacerlo de una manera fresca, con un agradecimiento especial a strtotime 's relative formats.

$friday = strtotime('Next Friday', time()); 
$saturday = strtotime('Next Saturday', time()); 
$friday = strtotime('+1 Week', $friday); 
$saturday = strtotime('+1 Week', $saturday); 

Por supuesto debe modificarlo para hacer exactamente lo que quiere, pero ese no es el punto que estaba tratando de hacer.

También tenga en cuenta que strtotime le dará indicaciones de tiempo. Para averiguar el uso Fecha:

date('Y-m-d', $friday) 

Otra cosa a saber es que Next <dayofweek> excluirá el día actual de la búsqueda, por lo que si usted también quiere incluir el día actual, puede hacerlo de esta manera:

$friday = strtotime('Next Friday', strtotime('-1 Day', time())); 

Y aquí hay un script de trabajo completo que hace exactamente lo que usted quería.

<?php 
// prevent multiple calls by retrieving time once // 
$now = time(); 
$aYearLater = strtotime('+1 Year', $now); 

// fill this with dates // 
$allDates = Array(); 

// init with next friday and saturday // 
$friday = strtotime('Next Friday', strtotime('-1 Day', $now)); 
$saturday = strtotime('Next Saturday', strtotime('-1 Day', $now)); 

// keep adding days untill a year has passed // 
while(1){ 
    if($friday > $aYearLater) 
     break 1; 
    $allDates[] = date('Y-m-d', $friday); 
    if($saturday > $aYearLater) 
     break 1; 
    $allDates[] = date('Y-m-d', $saturday); 

    $friday = strtotime('+1 Week', $friday); 
    $saturday = strtotime('+1 Week', $saturday); 
} 

//XXX: debug 
var_dump($allDates); 

?> 

Buena suerte, Alin

+0

Benchmark: ~ 0.011s –

+0

Gracias Alin, eso es sólo era lo que estaba buscando! ¡Absolutamente brillante! – Ben

1
$secondsperday=86400; 

$firstdayofyear=mktime(12,0,0,1,1,2010); 
$lastdayofyear=mktime(12,0,0,12,31,2010); 

$theday = $firstdayofyear; 

for($theday=$firstdayofyear; $theday<=$lastdayofyear; $theday+=$secondsperday) { 
    $dayinfo=getdate($theday); 
    if($dayinfo['wday']==5 or $dayinfo['wday']==6) { 
     print $dayinfo['weekday'].' '.date('Y-m-d',$theday)."<br />"; 
    } 
} 
+1

Los cálculos que usan 86400 dan por sentado que todos los días tienen 24 horas, lo que no siempre es el caso. El próximo sábado tiene 25 horas en España debido al horario de verano. –

+0

Punto de referencia: ~ 0.006s –

+0

También tenga en cuenta que las reglas de ahorro de luz diurna varían mucho en todo el mundo. Esta es la razón por la que debe usar las funciones de lenguaje integradas al manipular el tiempo. –

4

Con objetos DateTime:

<?php 

define('FRIDAY', 5); 
define('SATURDAY', 6); 

$from = new DateTime; 
$to = new DateTime('+1 year'); 

for($date=clone $from; $date<$to; $date->modify('+1 day')){ 
    switch($date->format('w')){ 
     case FRIDAY: 
     case SATURDAY: 
      echo $date->format('r') . PHP_EOL; 
    } 
} 

Actualización: He añadido la parte $date=clone $from a la observación de que los objetos en PHP/5 ya no son copiados con el operador = pero referenciado.

+0

Punto de referencia: ~ 0.006s –

1
$number_of_days_from_now = 365; 
    $now = time(); 

    $arr_days = array(); 

    $i = 0; 
    while($i <> $number_of_days_from_now){ 
     $str_stamp = "- $i day"; 
     $arr_days[] = date('Y-m-d',strtotime($str_stamp,$now)); 
     $i ++; 
    } 

    var_dump($arr_days); 

hice algo similar a la respuesta aceptada que no se adapta a mí

Cuestiones relacionadas