strtotime
Первым параметром функции должна быть строка с датой на английском языке, которая будет преобразована в метку времени относительно метки времени, переданной в now, или текущего времени, если аргумент now опущен. В случае ошибки возвращается -1.
Функция strtotime() использует GNU формат даты Date Input Formats, где описывается синтаксис аргумента time.
Проверить работу функции strtotime:
Функция strtotime() может распознавать следующие слова и сокращения.
- Название месяцев: 12 месяцев и соответствующие сокращения: Январь — January, Февраль — February, Март — March, Апрель — April, Май — May, Июнь — June, Июль — July, Август — August, Сентябрь — September, Октябрь — October, Ноябрь — November, Декабрь — December.
- Название дней недели: 7 дней и соответствующие сокращения:Понедельник — Monday, Вторник — Tuesday, Среда — Wednesday, Четверг — Thursday, Пятница — Friday, Суббота — Saturday, Воскресенье — Sunday.
- Название единиц времени: year (год), month (месяц), fortnight (две недели), week (неделя), day (день), hour (час), minute (минута), second (секунда), am (до полудня), рт (после полудня).
- Некоторые английские слова: ago (тому назад), now (сейчас), last (длиться), next (следующий); this (этот), tomorrow (завтра), yesterday (вчера).
- Знаки «плюс» и «минус».
- Все числа.
- Временные зоны: например, gmt (Greenwich Mean Time — среднее время по Гринвичу) или pdt (Pacific Daylight Time — дневное тихоокеанское время).
Пример 1. Пример использования функции strtotime()
echo strtotime("now"); echo strtotime("22.01.1971 10:11:36"); echo strtotime("10 September 2000"); echo strtotime("+1 day"); echo strtotime("+1 week"); echo strtotime("+1 week 2 days 4 hours 2 seconds"); echo strtotime("next Thursday"); echo strtotime("last Monday"); echo strtotime('Monday this week'); echo strtotime('first day'); echo strtotime('last day next month'); echo strtotime('last day last month'); echo strtotime('2009-12 last day'); // это не сработает, если в обратном порядке год и месяц echo strtotime('2009-03 last day'); echo strtotime('2009-03'); echo strtotime('last day of march 2009'); echo strtotime('last day of march'); echo strtotime('yesterday 14:00'); echo date("d.m.Y",strtotime("first day of previous month")); // первый день прошлого месяца echo date("d.m.Y",strtotime("last day of previous month")); // последний день прошлого месяца echo date("d.m.Y",strtotime("first day of this month")); // первый день текущего месяца echo date("d.m.Y",strtotime("first day of next month")); // первый день следующего месяца echo date('Y-m-d h:i:s',strtotime("-18 hours")); echo strtotime("tomorrow"); # 24 часа от сегодня echo strtotime("now + 24 hours"); echo strtotime("last Saturday"); echo strtotime("8pm + 3 days"); echo strtotime("2 weeks ago"); # две недели назад echo strtotime("next year gmt"); # на один год вперед echo strtotime ("tomorrow 4am"), echo strtotime( date("Y-01-01") ); // начало года echo strtotime( "next day 00:00" ); // начало следующего дня
Пример 2. Проверка ошибок
$str = 'Not Good'; if (($timestamp = strtotime($str)) === -1) < echo "Строка ($str) недопустима"; >else
Замечание: Для большинства систем допустимыми являются даты с 13 декабря 1901, 20:45:54 GMT по 19 января 2038, 03:14:07 GMT. (Эти даты соответствуют минимальному и максимальному значению 32-битового целого со знаком). Для Windows допустимы даты с 01-01-1970 по 19-01-2038. Не все платформы поддерживают отрицательные метки времени, поэтому даты ранее 1 января 1970 г. не поддерживаются в Windows, некоторых версиях Linux и некоторых других операционных системах.
Замечание: GMT формат с помощью strtotime преобразуется некорректно:
$strtotime = strtotime("Tue, 21 May 2013 09:10:30 GMT"); echo date("Y-m-d H:i:s", $strtotime),PHP_EOL; $strtotime = DateTime::createFromFormat("D, d M Y g:i:s O", "Tue, 21 May 2013 09:10:30 GMT"); echo $strtotime->format("Y-m-d H:i:s");
How to get last Monday in php
How to Speed up Your WordPress Website
How to always get the date last Monday in PHP, for example today is Tuesday 22/05 (Tuesday) and php gets the date 21/05 (Monday).
2 answers
$date = new DateTime("last monday");
What would be the last Monday that passed.
object(DateTime)#1 (3) < ["date"]=>string(26) "2018-05-21 00:00:00.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(16) "Europe/Amsterdam" >
Use date to format the date according to strtotime informed
echo date('d/m/Y',strtotime('-1 Monday')); // 21/05/2018 echo date('d-m-Y',strtotime('-1 Monday')); // 21-05-2018 echo date('d/m',strtotime('-1 Monday')); // 21-05 echo date('d-m',strtotime('-1 Monday')); // 21-05
The strtotime function accepts a string, in the format «US English date», and parse it into a timestamp , making it possible to add dates, get specific days, and count other features.
Last Monday strtotime(‘-1 Monday’);
Last Monday strtotime(«last Monday»);
Next fifth strtotime(«next Thursday»);
Next fifth strtotime(«+1 Thursday»);
Penultimate Monday strtotime(‘-2 Monday’);
Next Monday strtotime(‘+1 Monday’);
Catch the time now strtotime(«now»);
Using a textual date strtotime(«10 September 2017»);
Add a week strtotime(«+1 week»);
Add a week, two days, four hours, and two seconds strtotime(«+1 week 2 days 4 hours 2 seconds»);
Pick today’s date and add 10 days
$now = strtotime("now"); strtotime("+10 day",$now);
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'));
Поздний ответ, но я подумал, что я опубликую этот ответ (что на самом деле связано с другим, но связанным с ним вопросом). Он обрабатывает сценарий в вопросе:
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)
… или вариант, который воскреснет на следующий день (в понедельник), а не на предыдущую неделю, просто добавьте строку:
elseif (date('w', $date) == 0) return strtotime( 'next monday', $date );
Вы можете передать ему временную метку или строку, вы вернете отметку времени
Документация
Как было правильно указано в предыдущем ответе , этот трюк работает, но также были предостережения до 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');
или даже более короткие обозначения:
Будьте осторожны, потому что если вы делаете то же самое на 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);
strtotime
Первым параметром функции должна быть строка с датой на английском языке, которая будет преобразована в метку времени Unix (количество секунд, прошедших с 1 января 1970 г. 00:00:00 UTC) относительно метки времени, переданной в now , или текущего времени, если аргумент now опущен.
Каждый параметр функции использует временную метку по умолчанию, пока она не указана в этом параметре напрямую. Будьте внимательны и не используйте различные временные метки в параметрах, если на то нет прямой необходимости. Обратите внимание на date_default_timezone_get() для задания временной зоны различными способами.
Список параметров
Строка даты/времени. Объяснение корректных форматов дано в Форматы даты и времени.
Временная метка, используемая в качестве базы для вычисления относительных дат.
Возвращаемые значения
Возвращает временную метку в случае успеха, иначе возвращается FALSE . До версии PHP 5.1.0 в случае ошибки эта функция возвращала -1.
Ошибки
Каждый вызов к функциям даты/времени при неправильных настройках временной зоны сгенерирует ошибку уровня E_NOTICE , и/или ошибку уровня E_STRICT или E_WARNING при использовании системных настроек или переменной окружения TZ . Смотрите также date_default_timezone_set()
Список изменений
Теперь ошибки, связанные с временными зонами, генерируют ошибки уровня E_STRICT и E_NOTICE .
Примеры
Пример #1 Пример использования функции strtotime()
echo strtotime ( «now» ), «\n» ;
echo strtotime ( «10 September 2000» ), «\n» ;
echo strtotime ( «+1 day» ), «\n» ;
echo strtotime ( «+1 week» ), «\n» ;
echo strtotime ( «+1 week 2 days 4 hours 2 seconds» ), «\n» ;
echo strtotime ( «next Thursday» ), «\n» ;
echo strtotime ( «last Monday» ), «\n» ;
?>?php
Пример #2 Проверка ошибок
// до версии PHP 5.1.0 вместо false необходимо было сравнивать со значением -1
if (( $timestamp = strtotime ( $str )) === false ) echo «Строка ( $str ) недопустима» ;
> else echo » $str == » . date ( ‘l dS \o\f F Y h:i:s A’ , $timestamp );
>
?>
Примечания
Замечание:
Если количество лет указано двумя цифрами, то значения 00-69 будут считаться 2000-2069, а 70-99 — 1970-1999. Смотрите также замечания ниже о возможных различиях на 32-битных системах (допустимые даты заканчиваются 2038-01-19 03:14:07).
Замечание:
Корректным диапазоном временных меток обычно являются даты с 13 декабря 1901 20:45:54 UTC по 19 января 2038 03:14:07 UTC. (Эти даты соответствуют минимальному и максимальному значению 32-битового знакового целого).
До версии PHP 5.1.0, не все платформы поддерживают отрицательные метки времени, поэтому поддерживаемый диапазон дат может быть ограничен Эпохой Unix. Это означает, что даты ранее 1 января 1970 г. не будут работать в Windows, некоторых дистрибутивах Linux и нескольких других операционных системах.
В 64-битных версиях PHP корректный диапазон временных меток фактически бесконечен, так как 64 битов хватит для представления приблизительно 293 миллиарда лет в обоих направлениях.
Замечание:
Даты в формате m/d/y или d-m-y разрешают неоднозначность с помощью анализа разделителей их элементов: если разделителем является слеш (/), то дата интерпретируется в американском формате m/d/y, если же разделителем является дефис (—) или точка (.), то подразумевается использование европейского форматаd-m-y.
Чтобы избежать потенциальной неоднозначности, рекомендуется использовать даты в формате стандарта ISO 8601 (YYYY-MM-DD) либо пользоваться функцией DateTime::createFromFormat() там, где это возможно.
Замечание:
Не рекомендуется использовать эту функцию для математических операций. Целесообразней использовать DateTime::add() и DateTime::sub() начиная с PHP 5.3, или DateTime::modify() в PHP 5.2.
Смотрите также
- Форматы даты и времени
- DateTime::createFromFormat() — Создает и возвращает экземпляр класса DateTime, соответствующий заданному формату
- checkdate() — Проверяет корректность даты по григорианскому календарю
- strptime() — Разбирает строку даты/времени сгенерированную функцией strftime