php strtotime "dernier lundi" si aujourd'hui c'est lundi?
8 réponses
Comment puis-je faire revenir la date d'aujourd'hui dans ce cas?
pseudo:
if (today == monday)
return today;
else
return strtotime(...);
Btw, cette astuce pourrait également permettre:
strtotime('last monday', strtotime('tomorrow'));
si vous lisez le manuel, il y a un bon exemple qui décrit exactement ce que vous voulez faire http://www.php.net/manual/en/datetime.formats.relative.php
strtotime('Monday this week');
mise à Jour: Il semble y avoir un bug introduit dans les versions récentes de PHP où this week
renvoie le mal, lorsque, la semaine a couru le dimanche. Vous pouvez voter sur le bug ici: https://bugs.php.net/bug.php?id=63740
mise à Jour 2: à compter du 18 Mai 2016, cela a été corrigé dans PHP 5.6.22, PHP 7.0.7 et PHP 7.1-dev (et espérons-le, reste fixe dans les versions ultérieures), comme ici: https://bugs.php.net/bug.php?id=63740#1463570467
Si aujourd'hui, c'est lundi, strtotime("lundi") sera de retour d'une date de 7 jours dans le passé. Pourquoi ne pas vérifier si aujourd'hui c'est lundi et si oui, retourner la date d'aujourd'hui et si non, retourner la semaine dernière?
ce serait une façon infaillible de le faire.
if (date('N', time()) == 1) return date('Y-m-d');
else return date('Y-m-d', strtotime('last Monday'));
réponse tardive, mais je pensais afficher cette réponse (qui est en fait à partir d'une question différente mais liée). Il traite du 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)
l'essayer: http://codepad.org/rDAI4Scr
... ou une variation qui a Retour le dimanche le jour suivant (lundi) plutôt que la semaine précédente, il suffit d'ajouter une ligne:
elseif (date('w', $date) == 0)
return strtotime(
'next monday',
$date
);
l'essayer: http://codepad.org/S2NhrU2Z
vous pouvez lui passer un timestamp ou une chaîne, vous obtiendrez en arrière un timestamp
Documentation
comme il a été correctement décrit dans la réponse précédente , cette astuce fonctionne, mais a également 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');
à ceux qui préfèrent le" Jedy-way", de travailler avec des objets de la DateTime
classe , la solution est la suivante:
(new \DateTime())->modify('tomorrow')->modify('previous monday')->format('Y-m-d');
ou notation encore plus courte:
\DateTime('Monday this week')
soyez prudent, parce que si vous faites la même chose sur SQL, vous n'avez pas besoin d'avoir l'un de ces trucs dans mysql avec l'ajout de"demain". Voici à quoi ressemblera la solution:
SELECT DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY) as last_monday;
en fonction de ce que vous utilisez exactement, cela peut être utile. Puisque l'ambiguïté d'une seconde est acceptable pour mes besoins, j'utilise:
date( 'Y-m-d 23:59:59', strtotime( 'last sunday' ))
pour obtenir minuit le lundi le plus récent (ou aujourd'hui si aujourd'hui est lundi).
Mon approche:
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 mensuelle
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');
$monday = strtotime('Monday last week');
$sunday = strtotime('+6 days', $monday);