web-dev-qa-db-fra.com

php strtotime "dernier lundi" si aujourd'hui est lundi?

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?

35
Nathan H

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'));
67
zerkms

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

119
jmlnik

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'));

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

4
Vic

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;
1
Farside

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

1
Chris Baker

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).

0
Johno

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');
0
carbonero