¿Cómo encontrar la fecha de un día de la semana a partir de una fecha usando PHP?

85

Si tengo un $date YYYY-mm-ddy quiero obtener un específico $day(especificado por 0 (domingo) a 6 (sábado)) de la semana que YYYY-mm-ddestá en.

Por ejemplo, si tengo 2012-10-11como $datey 5como $day, quiero obtener 2012-10-12, si tengo 0como $day,2012-10-14

EDITAR:
La mayoría de ustedes lo entendieron mal. Tengo una fecha $datey quiero obtener un día especificado por 0-6 de la misma semana $date.

Entonces no, no quiero el día de $date...

Zulakis
fuente
¿Cuándo empieza tu semana? Lunes o Domingo? Sé que es lunes para la mayoría de la gente, pero solo me estoy asegurando: p
keyser
3
No creo que las personas que respondieron entendieron la pregunta correctamente. No quiere obtener un número del día por fecha (que sería fecha ('w')), pero quiere especificar la fecha Y el número de día y recibir la fecha correspondiente de la misma semana que la fecha especificada. .
Vafliik

Respuestas:

127

Creo que esto es lo que quieres.

$dayofweek = date('w', strtotime($date));
$result    = date('Y-m-d', strtotime(($day - $dayofweek).' day', strtotime($date)));
Rezigned
fuente
86

Puede utilizar la función date ():

date('w'); // day of week

o

date('l'); // dayname

Función de ejemplo para obtener el número de día:

function getWeekday($date) {
    return date('w', strtotime($date));
}

echo getWeekday('2012-10-11'); // returns 4
Powtac
fuente
17

Tratar

$date = '2012-10-11';
$day  = 1;
$days = array('Sunday', 'Monday', 'Tuesday', 'Wednesday','Thursday','Friday', 'Saturday');
echo date('Y-m-d', strtotime($days[$day], strtotime($date)));
air4x
fuente
2
Buen enfoque, pero como puede ver en la respuesta de Rezigned, también puede usar '1 día', haciendo que la matriz de $ días sea inútil.
Zulakis
1
Esto parece más correcto porque devuelve la fecha correcta 2012-10-14cuando 0ingresa, @Rezigned devuelve2012-10-07
Carl
7

Si tu fecha ya es una DateTimeo DateTimeImmutablepuedes usar el formatmétodo.

$day_of_week = intval($date_time->format('w'));

La cadena de formato es idéntica a la utilizada por la función de fecha .


Para responder a la pregunta deseada:

$date_time->modify($target_day_of_week - $day_of_week . ' days');
Johannes Buchholz
fuente
5

PHP Manual dijo:

w Representación numérica del día de la semana

Por lo tanto, puede construir una fecha con mktime y usarla date("w", $yourTime);

azul112
fuente
4

Sólo:

2012-10-11 como $ fecha y 5 como $ día

<?php
$day=5;
$w      = date("w", strtotime("2011-01-11")) + 1; // you must add 1 to for Sunday

echo $w;

$sunday = date("Y-m-d", strtotime("2011-01-11")-strtotime("+$w day"));

$result = date("Y-m-d", strtotime($sunday)+strtotime("+$day day"));

echo $result;

?>

El $ result = '2012-10-12' es lo que desea.

lijinma
fuente
1

Me temo que tienes que hacerlo manualmente. Obtenga el día de la semana actual de la fecha, calcule la compensación y agregue la compensación a la fecha.

$current = date("w", $date)
$offset = $day - $current
$new_date = new DateTime($date)
    ->add(
        new DateInterval($offset."D")
    )->format('Y-m-d')
John Dvorak
fuente
1
Gracias por tu enfoque, pero no, no tengo que hacerlo manualmente. Eche un vistazo a la respuesta de Rezigned.
Zulakis
1

Tuve que usar una solución similar para portugués (Brasil):

<?php
$scheduled_day = '2018-07-28';
$days = ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'];
$day = date('w',strtotime($scheduled_day));
$scheduled_day = date('d-m-Y', strtotime($scheduled_day))." ($days[$day])";
// provides 28-07-2018 (Sáb)
victorf
fuente
1
<?php echo date("H:i", time()); ?>
<?php echo $days[date("l", time())] . date(", d.m.Y", time()); ?>

Simple, esto debería funcionar

Rune Bøge
fuente