php strtotime "последний понедельник", если сегодня понедельник? - PullRequest
35 голосов
/ 11 ноября 2010

Я хочу использовать strtotime("last Monday").

Дело в том, что если сегодня понедельник, что он возвращает? Кажется, он возвращает дату понедельника прошлой недели. Как я могу заставить его вернуть сегодняшнюю дату в таком случае?

Ответы [ 8 ]

121 голосов
/ 24 января 2012

Если вы прочитаете руководство, есть отличный пример, который точно описывает, что вы хотите сделать http://www.php.net/manual/en/datetime.formats.relative.php

strtotime('Monday this week');

Обновление: В новых версиях PHP появилась ошибка , где this week возвращает неправильную неделю при запуске по воскресеньям. Вы можете проголосовать за ошибку здесь: https://bugs.php.net/bug.php?id=63740

Обновление 2: По состоянию на 18 мая 2016 года это было исправлено в PHP 5.6.22, PHP 7.0.7 и PHP 7.1-dev (и, надеюсь, останется исправленным в последующих выпусках), как показано здесь: https://bugs.php.net/bug.php?id=63740#1463570467

69 голосов
/ 11 ноября 2010

Как сделать так, чтобы в этом случае возвращалась текущая дата?

псевдокод:

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

Кстати, этот трюк также может работать:

strtotime('last monday', strtotime('tomorrow'));
4 голосов
/ 11 ноября 2010

Если сегодня понедельник, strtotime («последний понедельник») вернет дату 7 дней назад.Почему бы вам просто не проверить, если сегодня понедельник, и если да, вернуть сегодняшнюю дату, а если нет, вернуться на прошлой неделе?

Это было бы надежным способом сделать это.

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

1 голос
/ 20 февраля 2017

Как правильно было указано в предыдущем ответе , этот прием работает, но также имел предостережений до PHP 5.6.22, PHP 7.0.7 и PHP 7.1-dev:

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

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

Для тех, кто предпочитает «путь джедая», для работы с объектами DateTime класса , решение будет следующим:

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

илиеще более короткая запись:

\DateTime('Monday this week')

Будьте осторожны, потому что, если вы делаете то же самое с SQL, вам не нужно иметь ни одного из этих приемов в с добавлением"завтра".Вот как будет выглядеть решение:

SELECT DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY) as last_monday;
1 голос
/ 02 августа 2012

Поздний ответ, но я думал, что выложу этот ответ (который на самом деле из другого, но связанного вопроса).Он обрабатывает сценарий в вопросе:

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)

попробуйте: http://codepad.org/rDAI4Scr

... или вариант, который имеет воскресное возвращение на следующий день (понедельник) вместо предыдущей неделипросто добавьте строку:

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

попробуйте: http://codepad.org/S2NhrU2Z

Вы можете передать ему метку времени или строку, вы получите метку времени

Документация

0 голосов
/ 07 августа 2013

Мой подход:

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

или ежемесячно

    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 голосов
/ 01 февраля 2013

В зависимости от того, для чего именно вы его используете, это может быть полезно. Поскольку двусмысленность одной секунды подходит для моих требований, я использую:

date( 'Y-m-d 23:59:59', strtotime( 'last sunday' ))

чтобы получить полночь в самый последний понедельник (или сегодня, если сегодня понедельник).

0 голосов
/ 12 декабря 2012
$monday = strtotime('Monday last week');
$sunday = strtotime('+6 days', $monday);
...