2011-12-19 16 views
5

Por lo tanto, en PHP estoy tratando de devolver un valor de fecha para el año pasado basado en el mismo día de la semana. EX: (lunes) 2011-12-19 ingresado debe regresar (lunes) 2010-12-20.php - encuentra la fecha para el mismo día de la semana del año pasado

Lo estaba haciendo simplemente por -364 pero luego estaba fallando en los años bisiestos. Me encontré con otra función:

$newDate = $_POST['date']; 
$newDate = strtotime($newDate); 
$oldDate = strtotime('-1 year',$newDate); 

$newDayOfWeek = date('w',$oldDate); 
$oldDayOfWeek = date('w',$newDate); 
$dayDiff = $oldDayOfWeek-$newDayOfWeek; 

$oldDate = strtotime("$dayDiff days",$oldDate); 

echo 'LAST YEAR DAY OF WEEK DATE = ' . date('Ymd', $oldDate); 
embargo

, que está fallando cuando intenta introducir una fecha de domingo, como lo hace un 0 (Domingo) menos 6 (Sábado de la última fecha del año), y regresa con un valor T-6. IE ingresando 2011-12-25 lo consigue 2010-12-19 en lugar de 2011-12-26.

Estoy algo confundido por encontrar una buena solución en php que funcione para años bisiestos y obviamente todos los días de la semana.

¿Alguna sugerencia?

Gracias!

Respuesta

8

¿Qué hay de esto, utilizando DateTime funcionalidad de PHP:

$date = new DateTime('2011-12-25'); // make a new DateTime instance with the starting date 

$day = $date->format('l');   // get the name of the day we want 

$date->sub(new DateInterval('P1Y')); // go back a year 
$date->modify('next ' . $day);  // from this point, go to the next $day 
echo $date->format('Ymd'), "\n";  // ouput the date 
+1

que es bueno, pero ¿qué pasa con los años bisiestos? – Shea

+0

@andrewjackson funciona bien. '2012-12-25' da' 2011-12-27'. – lonesomeday

2

Uso strtotime() para obtener una fecha, para la misma semana del año pasado.

Usar el formato {$ Año} -W {} $ semana - {} $ de lunes a viernes, de esta manera:

echo date("Y-m-d", strtotime("2010-W12-1")); 

Y se puede hacer eso durante el tiempo de vuelta wan't:

<?php 

    for($i = 2011; $i > 2000; $i--) 
    echo date("Y-m-d", strtotime($i."-W12-1")); 

?> 
4
$newDate = '2011-12-19'; 

date_default_timezone_set('UTC'); 
$newDate = strtotime($newDate); 
$oldDate = strtotime('last year', $newDate); 
$oldDate = strtotime(date('l', $newDate), $oldDate); 

$dateFormat = 'Y-m-d l w W'; 

echo "This date: ", date($dateFormat, $newDate), "\n"; 
echo "Old date : ", date($dateFormat, $oldDate); 

Eso da:

This date: 2011-12-19 Monday 1 51 
Old date : 2010-12-20 Monday 1 51 
2

que sea más fácil :)

echo date('Y-m-d (l, W)').<br/>; 
echo date('Y-m-d (l, W)', strtotime("-52 week")); 

Editar: Me olvidé de escribir la salida: :)

2015-05-06 (Wednesday, 19) 
2014-05-07 (Wednesday, 19) 
Cuestiones relacionadas