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

je veux utiliser strtotime("last Monday") .

la chose est, si aujourd'hui est lundi, qu'est-ce qu'il retourne? On dirait qu'il renvoie la date du lundi de la semaine dernière. Comment puis-je faire revenir la date d'aujourd'hui dans ce cas?

33
demandé sur alex 2010-11-11 03:31:31

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'));
66
répondu zerkms 2010-11-11 00:43:00

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

119
répondu jmlnik 2016-05-26 08:59:32

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

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

4
répondu Vic 2010-11-11 00:46:15

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

1
répondu Chris Baker 2012-08-02 05:00:06

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 avec l'ajout de"demain". Voici à quoi ressemblera la solution:

SELECT DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY) as last_monday;
1
répondu Farside 2017-05-23 12:09:39

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

0
répondu Johno 2013-02-01 12:47:20

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');
0
répondu carbonero 2013-08-07 00:00:42
$monday = strtotime('Monday last week');
$sunday = strtotime('+6 days', $monday);
-1
répondu Stefan Gabos 2012-12-12 08:51:38