Я хочу использовать strtotime("last Monday")
.
Дело в том, что если сегодня ПОНЕДЕЛЬНИК, что он возвращается? Кажется, он возвращает дату в понедельник на прошлой неделе. Как я могу заставить его вернуть сегодняшнюю дату в этом случае?
Я хочу использовать strtotime("last Monday")
.
Дело в том, что если сегодня ПОНЕДЕЛЬНИК, что он возвращается? Кажется, он возвращает дату в понедельник на прошлой неделе. Как я могу заставить его вернуть сегодняшнюю дату в этом случае?
Как я могу заставить его вернуть сегодняшнюю дату в этом случае?
псевдокод:
if (today == monday)
return today;
else
return strtotime(...);
Btw, этот трюк также мог бы работать:
strtotime('last monday', strtotime('tomorrow'));
Если вы прочитали руководство, есть отличный пример, который точно описывает, что вы хотите сделать 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
Если сегодня понедельник, strtotime ( "последний понедельник" ) вернет дату 7 дней в прошлом. Почему бы вам просто не проверить, является ли сегодня понедельник, и если да, верните сегодняшнюю дату, а если нет, вернитесь на прошлой неделе?
Это было бы надежным способом сделать это.
if (date('N', time()) == 1) return date('Y-m-d');
else return date('Y-m-d', strtotime('last Monday'));
Поздний ответ, но я подумал, что я опубликую этот ответ (что на самом деле связано с другим, но связанным с ним вопросом). Он обрабатывает сценарий в вопросе:
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
Вы можете передать ему временную метку или строку, вы вернете отметку времени
Documentation
Как это было правильно указано в предыдущем ответе , этот трюк работает, но также имеет предостережения до 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');
Для тех, кто предпочитает "Jedy-way", для работы с объектами класса DateTime
, решение следующее
(new \DateTime())->modify('tomorrow')->modify('previous monday')->format('Y-m-d');
или даже более короткие обозначения:
\DateTime('Monday this week')
Будьте осторожны, потому что если вы делаете то же самое на SQL, вам не нужно иметь какие-либо из этих трюков в mysql с добавлением "завтра". Вот как будет выглядеть решение:
SELECT DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY) as last_monday;
В зависимости от того, для чего вы его используете, это может быть полезно. Поскольку одна вторая двусмысленность в порядке для моих требований, я использую:
date( 'Y-m-d 23:59:59', strtotime( 'last sunday' ))
чтобы получить полночь в последний понедельник (или сегодня, если сегодня есть понедельник).
Мой подход:
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');
$monday = strtotime('Monday last week');
$sunday = strtotime('+6 days', $monday);