2010-08-19 22 views
15

Tengo dos piezas de información extraída de una base de datos MySQL, el año (2009, 2010, etc) y la semana (1-52). Y necesito para convertirlo en un comienzo fecha y la fecha final, ..de año y semana hasta la fecha en php

Por ejemplo:

Year=2010, Week=1 would be (Friday, Jan 1st, 2010) - (Sunday, Jan 3rd, 2010) 
Year=2010, Week=33 would be (Monday, Aug 16th, 2010) - (Sunday, Aug 22nd, 2010) 
Year=2010, Week=34 would be (Monday, Aug 23rd, 2010) - (Sunday, Aug 29th, 2010) 

¿Cómo voy a ir haciendo que en php?

Respuesta

29
$year = "2010"; // Year 2010 
$week = "01"; // Week 1 

$date1 = date("l, M jS, Y", strtotime($year."W".$week."1")); // First day of week 
$date2 = date("l, M jS, Y", strtotime($year."W".$week."7")); // Last day of week 
echo $date1 . " - " . $date2; 

Si número de la semana es inferior al 10 luego anexar un 0 antes del número. 1 no quiere trabajar, que debe ser 01.

+3

Si utiliza 'sprintf ("% 02u", $ week) 'en lugar de' $ week', el número de la semana siempre se antepondrá con un 0 si es menor que 10. –

+0

Mysql Week start with zero –

0

Trate de hacer esto:

$year = 2000; 
$week = 1; 
$start = date("l, M jS, Y", strtotime("01 Jan ".$year." 00:00:00 GMT + ".$week." weeks")); 
$end = date("l, M jS, Y", strtotime($start." + 1 week")); 
echo $start." to ".$end; 

Es necesario configurar año y $ $ semana. Luego imprimirá el intervalo como se especifica.

Por ejemplo, la salida tal cual es:

Friday, Jan 7th, 2000 to Friday, Jan 14th, 2000 

Nota que semanas son indexados 0-51 (fácil de solucionar).

Es un poco feo, pero funciona. ¡Espero que ayude!

2
function getStartAndEndDate($week, $year) 
{ 
    //setting the default time zone 
    date_default_timezone_set('America/New_York'); 

    //getting the 
    //$firstWeek = date('W',strtotime("January 1 $year", date(time()))); 
    //echo "Year : ".$year."<br/>"."Week : ".$week."<br/>"; 
    $firstWeekThursDay = date('W',strtotime("January $year first thursday",date(time()))); 

    if($firstWeekThursDay == "01") 
    { 
     $time  = strtotime("January $year first thursday",date(time())); 
     //echo $time."<br/>"; 
     //echo date('Y-m-d H:i:s',$time)."<br/>"; 
     $time  = ($time-(4*24*3600))+(((7*$week)-6)*24*3600); 
     //echo $time."<br/>"; 
     //echo date('Y-m-d H:i:s',$time)."<br/>"; 
     $return[0] = date('Y-m-d', $time); 
     $time += 6*24*3600; 
     $return[1] = date('Y-m-d', $time); 
     //print_r($return); 
    } 
    else 
    { 
     $time = strtotime("January 1 $year", time()); 
     //echo "<br/>".$time."<br/>"; 
     //echo date('Y-m-d H:i:s',$time)."<br/>"; 
     $time  = ($time-(4*24*3600))+(((7*$week)-6)*24*3600); 
     //echo $time."<br/>"; 
     //echo date('Y-m-d H:i:s',$time)."<br/>"; 
     $return[0] = date('Y-m-d', $time); 
     $time  += 6*24*3600; 
     $return[1] = date('Y-m-d', $time); 
     //print_r($return); 
     //echo "<br/>End of Hi<br/>"; 

    } 
    return $return; 
} 
+0

¡¡¡Excelente !!! Este trabajo para mí, gracias :) –

9

Desde esta pregunta y la respuesta aceptada se publicaron las clases DateTime hacen de este mucho más simple de hacer: -

function daysInWeek($weekNum) 
{ 
    $result = array(); 
    $datetime = new DateTime(); 
    $datetime->setISODate((int)$datetime->format('o'), $weekNum, 1); 
    $interval = new DateInterval('P1D'); 
    $week = new DatePeriod($datetime, $interval, 6); 

    foreach($week as $day){ 
     $result[] = $day->format('d/m/Y'); 
    } 
    return $result; 
} 

var_dump(daysInWeek(24)); 

de salida: -

array (size=7) 
    0 => string '10/06/2013' (length=10) 
    1 => string '11/06/2013' (length=10) 
    2 => string '12/06/2013' (length=10) 
    3 => string '13/06/2013' (length=10) 
    4 => string '14/06/2013' (length=10) 
    5 => string '15/06/2013' (length=10) 
    6 => string '16/06/2013' (length=10) 

Esto tiene la ventaja añadida de cuidar de los años bisiestos, etc ..

+1

Esta es la mejor respuesta disponible actualmente. –

+0

esta respuesta no funciona correctamente con el año bisiesto – undefinedman

+0

@undefinedman Ahora debería, gracias por el aviso. – vascowhite

Cuestiones relacionadas