2009-11-02 19 views

Respuesta

10

Sin embargo, otra solución:

<?php 
     $week = 3; 
     $year = 2009; 

     $timestamp = mktime(0, 0, 0, 1, 1, $year) + ($week * 7 * 24 * 60 * 60); 
     $timestamp_for_monday = $timestamp - 86400 * (date('N', $timestamp) - 1); 
     $date_for_monday = date('Y-m-d', $timestamp_for_monday); 
?> 
+1

Esta es la solución de trabajo más simple hasta la fecha en ambas plataformas Linux y Windows. – Amadeus45

+0

'date ('U', $ timestamp)' podría acortarse a '$ timestamp'. – deceze

+0

Actualizado según la sugerencia de deceze. –

3

Puede usar strptime() para obtener el tiempo.

$time = strptime('1 23 2009', '%w %U %Y'); 

Esto hará que el tiempo para el lunes (día 1, 0 es el domingo, 6 es sábado) de la semana 23 de 2009. Si desea dar formato a esto en una fecha, utilice date().

$date = date('d F Y', $time); 
+0

+1: Su forma es mucho más fácil de lo mía. : D – NawaMan

+0

Sí, dice en las notas de la página PHP.net: no-worky en Windows. – seanmonstar

+0

En PHP> = 5.3, parece que el objeto DateTime contiene esta funcionalidad, también en Windows. http://www.php.net/manual/en/datetime.createfromformat.php – gnud

0

Aquí hay una solución muy simple, pasando una semana no y devuelve la fecha.

La norma ISO8601 establece que la semana 1 siempre cae en la semana en que cae el 4 de enero.

Por ejemplo, para obtener un día en la cuarta semana del año:

$day_in_week = strtotime("2006-01-04 + 4 weeks")); 

Luego usted puede ajustar este valor a domingo (como punto de partida se puede garantizar que usted puede encontrar):

// Find that day's day of the week (value of 0-6) 
$wday = date('w', $day_in_week); 
$offset = 6 - $wday; // How far it is from Sunday. 
$sunday_in_week = $day_in_week - ($offset * (60 * 60 * 24)); // $offset * seconds in a day 

Luego, agrega los segundos en un día nuevamente para obtener el lunes.

$monday_in_week = $sunday_in_week + (60 * 60 * 24); 

Nota: Este método puede en ocasiones tener algunos problemas con el horario de verano. Un método similar, y ligeramente más seguro entre los cambios de horario DST, usaría the DateTime class. Sin embargo, DateTime solo es compatible en PHP 5.2.0 o posterior. El método anterior también funciona en versiones anteriores.

0

Pruebe esta función

function MondayOfWeek($WeekNumber, $Year=-1) { 
    if ($Year == -1) $Year = 0+date("Y"); 
    $NewYearDate    = mktime(0,0,0,1,1,$Year); 
    $FirstMondayDate   = 7 + 1 - date("w", mktime(0,0,0,1,1,2009)); 
    $Dates_fromFirstMonday = 7 * $WeekNumber; 
    $Second_fromFirstMonday = 60*60*24*($FirstMondayDate + $Dates_fromFirstMonday); 
    $MondayDay_ofWeek  = $NewYearDate + $Second_fromFirstMonday; 
    $Date_ofMondayDay_ofWeek = 0+date("j", $MondayDay_ofWeek); 
    return $Date_ofMondayDay_ofWeek; 
} 

for($i = 0; $i

Cuando se ejecuta, que tengo:

-5-12-19-26-2-9-16-23-2-9-16-23-30-6-13-20-27-4-11-18-25-1-8-15-22-29-6-13-20-27-3-10-17-24-31-7-14-21-28-5-12-19-26-2-9-16-23-30-7-14-21-28 

Espero que esto ayude.

1

parece estar funcionando y no depende del sistema operativo del servidor:

<?php 

    $week = 4; 
    $year = 2013; 

    $timestamp_for_monday = mktime(0, 0, 0, 1, 1, $year) + ((7+1-(date('N', mktime(0, 0, 0, 1, 1, $year))))*86400) + ($week-2)*7*86400 + 1 ; 

?> 

la idea es añadir:

  • la marca de tiempo del primero de enero del año elegido
  • la número de segundos para llegar al final de la primera semana (que es 7 días menos el día de la semana del 1 de enero + 1 día) multiplicado por el número de segundos por día
  • th e número de segundos del número de semanas elegidas menos la primera semana y la semana en curso
  • 1 segundo para alcanzar el segundo puño de la semana en curso

Mi ejemplo devuelve: 1358722801 que es la marca de tiempo de 2013/01/21 0:00:01

41

es simple en PHP 5,3

echo date('M d',strtotime('2013W15')); 

donde 15 es el número de semanas. Pero para el número inferior a diez, asegúrese de que esté en el formato 01, 02 para la primera semana y la segunda semana.

+0

No veo ningún problema al usar esto con PHP 5.2 o 5.1 tampoco. Funcionó muy bien para mí y estoy usando 5.2.18, creo. Gracias por este atajo! – Metropolis

5

Una buena manera de obtener esto de una manera limpia es mediante el uso de php clase DateTime.

$year = 2015; 
$week_no = 1; 

$date = new DateTime(); 
$date->setISODate($year,$week_no); 
echo $date->format('d-M-Y'); 

Esto se traduciría en: 29-12-2014

1

La siguiente secuencia de comandos da los 7 días de una semana específica de un año

$time = new DateTime(); 
$time->setISODate(2016, 13); 
for($i=0;$i<7;$i++){ 
    echo $time->format('d-M-Y') . '<br />'; 
    $time->add(new DateInterval('P1D')); 
} 
Cuestiones relacionadas