Intereting Posts
Запуск parse_url () в строке, которая не может содержать протокол Можно ли указать интерфейс исходящей сети для использования в PHP SoapClient? Поиск декартова продукта с ассоциативными массивами PHP MySQL дата или время PHP? Результаты Weird MYSQL с использованием PDO :: FETCH_ASSOC без псевдонима столбца Как передать инструкции условия в запрос mySql Ошибка MySQL: «Количество столбцов не соответствует количеству значений в строке 1» – помощь для начинающих Получить или переназначить сеанс пользователя из ip и user-agent Как предотвратить переопределение параметра с помощью .htaccess или настраиваемого php.ini toggle () div с отправкой данных формы Подавить фиктивный PHP imap_open () Примечание: небезопасный сервер рекламируется AUTH = PLAIN Yii 2: как объединить удаление данных в виде сетки картика? Создайте сканер с поддержкой JavaScript Загрузка нескольких версий одного и того же класса установить php70-gd на ubuntu

php strtotime «последний понедельник», если сегодня понедельник?

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

Дело в том, что если сегодня ПОНЕДЕЛЬНИК, что он возвращается? Кажется, он возвращает дату в понедельник на прошлой неделе. Как я могу заставить его вернуть сегодняшнюю дату в этом случае?

Как я могу заставить его вернуть сегодняшнюю дату в этом случае?

псевдокод:

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

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

 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('Ym-d'); else return date('Ym-d', strtotime('last Monday')); 

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

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

 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

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

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

Как было правильно указано в предыдущем ответе , этот трюк работает, но также были предостережения до 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('Ym-d'); 

или даже более короткие обозначения:

 \DateTime('Monday this week') 

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

 SELECT DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY) as last_monday; 

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

 date( 'Ymd 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("dmY - H:i",$next); } else { $date = date("dmY - 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("dmY - H:i",$next); } else { $date = date("dmY - H:i",$last); } return $date; } echo givedate_monthly('Wednesday', '01:50'); 
 $monday = strtotime('Monday last week'); $sunday = strtotime('+6 days', $monday);