php strtotime “el último lunes” si hoy es lunes?

Quiero usar strtotime("last Monday") .

El caso es que si hoy ES LUNES, ¿qué devuelve? Parece devolver la fecha del lunes de la semana pasada. ¿Cómo puedo hacer que devuelva la fecha de hoy en ese caso?

¿Cómo puedo hacer que devuelva la fecha de hoy en ese caso?

pseudocódigo:

 if (today == monday) return today; else return strtotime(...); 

Por cierto, este truco también podría funcionar:

 strtotime('last monday', strtotime('tomorrow')); 

Si lee el manual, hay un gran ejemplo que describe exactamente lo que quiere hacer http://www.php.net/manual/en/datetime.formats.relative.php

 strtotime('Monday this week'); 

Actualización: Parece haber un error introducido en las versiones más nuevas de PHP, donde this week devuelve la semana incorrecta cuando se ejecuta los domingos. Puede votar el error aquí: https://bugs.php.net/bug.php?id=63740

Actualización 2: A partir del 18 de mayo de 2016, esto se ha corregido en PHP 5.6.22, PHP 7.0.7 y PHP 7.1-dev (y con suerte permanece fijo en versiones posteriores) como se ve aquí: https://bugs.php.net /bug.php?id=63740#1463570467

Si hoy es lunes, strtotime (“el último lunes”) devolverá una fecha de 7 días en el pasado. ¿Por qué no solo comprueba si hoy es lunes y, en caso afirmativo, devuelve la fecha de hoy y, si no, la devuelve la semana pasada?

Esa sería una forma infalible de hacer esto.

 if (date('N', time()) == 1) return date('Ym-d'); else return date('Ym-d', strtotime('last Monday')); 

http://us2.php.net/manual/en/function.date.php

Última respuesta, pero pensé que publicaría esta respuesta (que en realidad proviene de una pregunta diferente pero relacionada). Maneja el escenario en la pregunta:

 function last_monday($date) { if (!is_numeric($date)) $date = strtotime($date); if (date('w', $date) == 1) return $date; else return strtotime( 'last monday', $date ); } echo date('m/d/y', last_monday('8/14/2012')); // 8/13/2012 (tuesday gives us the previous monday) echo date('m/d/y', last_monday('8/13/2012')); // 8/13/2012 (monday throws back that day) echo date('m/d/y', last_monday('8/12/2012')); // 8/06/2012 (sunday goes to previous week) 

pruébelo: http://codepad.org/rDAI4Scr

… o una variación que ha devuelto el domingo al día siguiente (lunes) en lugar de la semana anterior, simplemente agregue una línea:

  elseif (date('w', $date) == 0) return strtotime( 'next monday', $date ); 

pruébalo: http://codepad.org/S2NhrU2Z

Puedes pasarle una marca de tiempo o una cadena, obtendrás una marca de tiempo

Documentación

Como se describió correctamente en la respuesta anterior , este truco funciona, pero también tenía advertencias antes de PHP 5.6.22 , PHP 7.0.7 y PHP 7.1-dev :

 strtotime('last monday', strtotime('tomorrow')); // or this one, which is shorter, but was buggy: strtotime('Monday this week'); 

Para aquellos que prefieren “Jedy-way”, para trabajar con objetos de la clase DateTime , la solución es la siguiente:

 (new \DateTime())->modify('tomorrow')->modify('previous monday')->format('Ym-d'); 

o incluso una notación más corta:

 \DateTime('Monday this week') 

Tenga cuidado, porque si hace lo mismo en SQL, no necesita tener ninguno de estos trucos en mysql con la adición de “mañana”. Así es como se verá la solución:

 SELECT DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY) as last_monday; 

Dependiendo de exactamente para lo que lo está usando, esto puede ser útil. Como la ambigüedad de un segundo está bien para mis requisitos, utilizo:

 date( 'Ymd 23:59:59', strtotime( 'last sunday' )) 

para obtener la medianoche del lunes más reciente (o hoy si hoy es lunes).

Mi enfoque:

 date_default_timezone_set('Europe/Berlin'); function givedate($weekday, $time) { $now = time(); $last = strtotime("$weekday this week $time"); $next = strtotime("next $weekday $time"); if($now > $last) { $date = date("dmY - H:i",$next); } else { $date = date("dmY - H:i",$last); } return $date; } echo givedate('Wednesday', '00:52'); 

O mensualmente

  function givedate_monthly($weekday, $time) { $now = time(); $last = strtotime("first $weekday of this month $time"); $next = strtotime("first $weekday of next month $time"); if($now > $last) { $date = date("dmY - H:i",$next); } else { $date = date("dmY - H:i",$last); } return $date; } echo givedate_monthly('Wednesday', '01:50'); 
 $monday = strtotime('Monday last week'); $sunday = strtotime('+6 days', $monday);