Je veux utiliser strtotime("last Monday")
.
Le problème est que, si aujourd'hui IS LUNDI, que retourne-t-il? Il semble que la date soit retournée pour le lundi de la semaine dernière. Comment puis-je le faire revenir la date d'aujourd'hui dans ce cas?
Comment puis-je le faire revenir la date d'aujourd'hui dans ce cas?
pseudocode:
if (today == monday)
return today;
else
return strtotime(...);
Btw, cette astuce pourrait également fonctionner:
strtotime('last monday', strtotime('tomorrow'));
Si vous lisez le manuel, vous trouverez un excellent exemple qui décrit exactement ce que vous voulez faire http://www.php.net/manual/en/datetime.formats.relative.php
strtotime('Monday this week');
Update: Il semble y avoir un bogue introduit dans les versions les plus récentes de PHP où this week
renvoie la mauvaise semaine lorsqu'il est exécuté le dimanche. Vous pouvez voter sur le bogue ici: https://bugs.php.net/bug.php?id=63740
Mise à jour 2: Depuis le 18 mai 2016, ceci a été corrigé dans PHP 5.6.22, PHP 7.0.7 et PHP 7.1-dev (et reste, espérons-le, corrigé versions ultérieures), comme indiqué ici: https://bugs.php.net/bug.php?id=63740#1463570467
Si aujourd'hui est lundi, strtotime ("dernier lundi") renverra une date de 7 jours dans le passé. Pourquoi ne pas vérifier si aujourd'hui est lundi et si oui, renvoyer la date d'aujourd'hui et si non, la semaine dernière?
Ce serait un moyen infaillible de le faire.
if (date('N', time()) == 1) return date('Y-m-d');
else return date('Y-m-d', strtotime('last Monday'));
Comme cela a été correctement décrit dans la réponse précédente , cette astuce fonctionne, mais il y avait aussi caveats avant PHP 5.6.22
, PHP 7.0.7
et PHP 7.1-dev
:
strtotime('last monday', strtotime('tomorrow'));
// or this one, which is shorter, but was buggy:
strtotime('Monday this week');
Pour ceux qui préfèrent le "chemin Jedy", pour travailler avec des objets de la classe DateTime
, la solution est la suivante:
(new \DateTime())->modify('tomorrow')->modify('previous monday')->format('Y-m-d');
ou même une notation plus courte:
\DateTime('Monday this week')
Attention, car si vous faites la même chose avec SQL, vous n'avez pas besoin de ces astuces dans mysql avec l'ajout de «demain». Voici à quoi ressemblera la solution:
SELECT DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY) as last_monday;
Réponse tardive, mais je pensais poster cette réponse (qui provient d’une question différente mais liée). Il gère le scénario dans la question:
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)
essayez-le: http://codepad.org/rDAI4Scr
... ou une variante qui revient dimanche le lendemain (lundi) plutôt que la semaine précédente, ajoutez simplement une ligne:
elseif (date('w', $date) == 0)
return strtotime(
'next monday',
$date
);
essayez-le: http://codepad.org/S2NhrU2Z
Vous pouvez lui passer un timestamp ou une chaîne, vous récupérerez un timestamp
Documentation
En fonction de l'utilisation que vous en faites, cela peut être utile. Étant donné que l'ambiguïté d'une seconde convient à mes besoins, j'utilise:
date( 'Y-m-d 23:59:59', strtotime( 'last sunday' ))
pour avoir minuit le lundi le plus récent (ou aujourd'hui si aujourd'hui IS lundi).
Mon aproach:
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("d.m.Y - H:i",$next);
}
else {
$date = date("d.m.Y - H:i",$last);
}
return $date;
}
echo givedate('Wednesday', '00:52');
Ou mensuel
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("d.m.Y - H:i",$next);
}
else {
$date = date("d.m.Y - H:i",$last);
}
return $date;
}
echo givedate_monthly('Wednesday', '01:50');