Что вы имеете в виду под первым днем недели? Вы имеете в виду вс, пн? Или вы имеете в виду дату первого дня недели?
Джеффри Хайнс,
2
Первый день недели постоянен: это понедельник (или, возможно, воскресенье). Вы имеете в виду, что хотите получить дату понедельника, предшествующего заданной произвольной дате?
Джон Крам,
Какая версия PHP - 4 или 5?
Джон Крам,
дата воскресенья недели. php 5
Игги Ма
Странно, но он просит DateTimeрешения, но в большинстве ответов его не дает. =)
$ day содержит число от 0 до 6, представляющее день недели (воскресенье = 0, понедельник = 1 и т. д.). $ week_start содержит дату воскресенья текущей недели в формате мм-дд-гггг. $ week_end содержит дату субботы текущей недели в формате мм-дд-гггг.
this weekне работает, если вам нужно всегда иметь предыдущее начало недели, но комментарий @LewisBuckley делает это.
Smar
Второй аргумент time()необязателен, если вы хотите указать сегодня.
Ifnot 07
у меня не сработало, пришлось использовать немного другой синтаксис для YTD, MTD, WTD.
Рон
6
Этот ответ дает противоречивые результаты в зависимости от используемой версии PHP: решение 3v4l.org/Z3k4E @ LewisBuckley совместимо для всех версий: 3v4l.org/Eeh9c
Относительные описания, подобные этой неделе, имеют свой собственный контекст. Ниже показаны выходные данные для понедельника и воскресенья этой недели, когда это понедельник или воскресенье:
$date ='2015-03-16';// monday
echo date("Y-m-d", strtotime('monday this week', strtotime($date))),"\n";
echo date("Y-m-d", strtotime('sunday this week', strtotime($date))),"\n";
$date ='2015-03-22';// sunday
echo date("Y-m-d", strtotime('monday this week', strtotime($date))),"\n";
echo date("Y-m-d", strtotime('sunday this week', strtotime($date))),"\n";
почему это не работает на дату 2016-06-05, это дает даты на следующей неделе.
1
Спасибо за это, я только что изменил этот код, чтобы передать необязательный параметр даты $ dt = $ custom_date? strtotime ($ custom_date): время (); $ monday = date ("Ymd", strtotime ('понедельник на этой неделе', $ dt)); $ sunday = date ("Ymd", strtotime ('воскресенье на этой неделе', $ dt));
Рон Майкл
47
Будь проще :
<?php
$dateTime =new \DateTime('2020-04-01');
$monday = clone $dateTime->modify(('Sunday'== $dateTime->format('l'))?'Monday last week':'Monday this week');
$sunday = clone $dateTime->modify('Sunday this week');?>
изменить: опечатка или какой-то неизвестный синтаксис? откуда \? $dateTime = new \DateTime('2012-05-14');
Sliq
2
Я делаю это, чтобы избежать конфликта с возможным автоматически загружаемым объектом вашего приложения. Это похоже на абсолютный или относительный путь.
job3dot5
9
@Panique - «неизвестный синтаксис» - это синтаксис пространства имен PHP 5.3. Пространство имен позволяет вам ставить перед классом пространство имен, за которым следует обратная косая черта. Здесь он использует его без пространства имен, чтобы указать базовый DateTimeкласс, что означает, что код будет работать, даже если у вас есть другой класс, вызванный DateTimeв текущем пространстве имен.
Spudley
Название дня всегда на английском языке?
Marwelln
1
Клонирующая часть работает некорректно. Вы должны сначала клонировать, а затем выполнить операцию с клоном, если вам нужен оригинальный.
Фарид Мовсумов
25
$givenday = date("w", mktime(0,0,0, MM, dd, yyyy));
Это дает вам день недели самой данной даты, где 0= воскресенье и 6= суббота. Оттуда вы можете просто рассчитать в обратном направлении к желаемому дню.
Этот ответ показывает, является ли данная дата воскресеньем или понедельником и т. Д. Но спрашивающий спросил дату воскресенья недели данной даты, как указано в его комментарии к исходному вопросу.
РЕДАКТИРОВАТЬ: приведенная ниже ссылка больше не работает в указанной версии PHP. Он работает на PHP 5.6, что повышает надежность strtotime, но не идеально! Результаты в таблице являются живыми результатами PHP 5.6.
Как бы то ни было, вот анализ шаткого поведения strtotime при определении согласованной системы отсчета:
В статье также был указан конкретный код для использования: $ start_of_week = strtotime («следующий понедельник - 1 неделя»); // Вернется понедельник текущей недели, начиная с 00:00:00 "$ end_of_week = strtotime (" следующий понедельник - 1 секунда "); // Вернется воскресенье текущей недели, заканчивающейся в 23:59:59"
Скотт M. Stolz
11
Следующий код должен работать с любой настраиваемой датой, просто используется желаемый формат даты.
Стоит отметить, что это всегда будет возвращать предыдущий понедельник, поэтому, если $ custom_date - понедельник, он вернет дату понедельника на неделю раньше.
Hill79 05
2
Не работает должным образом, сегодня воскресенье, результаты такие: Начало: 09.09.2013 Конец: 22.09.2013
user2019515
10
Предполагая, что понедельник является первым днем недели, это работает:
«ММ-дд-гггг» - это не то же самое, что «Ymd», пожалуйста, адаптируйте свой ответ с учетом специфики вопроса.
Евгений Афанасьев
1
date ("MM-dd-yyyy") выводит дату как: NovNov-0202-15151515. Я надеюсь, что это должно быть: date ("Mdy"), которая выводит читаемую дату, например: 02-15 ноября
shasi kanth
«ММ-дд-гггг» происходит от вопроса. Если не совсем понимаете, что это значит - задайте в комментарии к вопросу. Спасибо, что изменили свой ответ.
Последний понедельник по понедельникам будет означать предыдущий понедельник.
Ikke
8
Это то, что я использую, чтобы получить первый и последний день недели с любой даты . В этом случае понедельник - это первый день недели ...
$date = date('Y-m-d')// you can put any date you want
$nbDay = date('N', strtotime($date));
$monday =newDateTime($date);
$sunday =newDateTime($date);
$monday->modify('-'.($nbDay-1).' days');
$sunday->modify('+'.(7-$nbDay).' days');
Сначала вы должны получить следующий понедельник, а затем «последний понедельник» следующего понедельника. Таким образом, если заданная дата - понедельник, она вернет ту же дату, что и понедельник на прошлой неделе.
Что делает этот ответ предпочтительнее этого ответа или этого ответа ? Мне кажется, что в 30 других ответах более чем достаточно вариантов ...
Mogsdad
Спасибо. это простое решение, и оно работает как шарм.
Олег Попов
2
Разумный способ сделать это - позволить PHP обрабатывать разницу в часовых поясах и переход на летнее время (DST). Позвольте мне показать вам, как это сделать.
Эта функция будет генерировать все дни с понедельника по пятницу включительно (удобно для генерации рабочих дней недели):
Это вернет время с понедельника по пятницу для текущей недели. Чтобы сделать то же самое для произвольной даты, передайте дату в качестве параметра DateTimeUtilities ::getPeriodFromMondayUntilFriday, таким образом:
<?php
/* PHP 5.3.0 */
date_default_timezone_set('America/Denver');//Set apprpriate timezone
$start_date = strtotime('2009-12-15');//Set start date//Today's date if $start_date is a Sunday, otherwise date of previous Sunday
$today_or_previous_sunday = mktime(0,0,0, date('m', $start_date), date('d', $start_date), date('Y', $start_date))-((date("w", $start_date)==0)?0:(86400* date("w", $start_date)));//prints 12-13-2009 (month-day-year)
echo date('m-d-Y', $today_or_previous_sunday);?>
(Примечание: MM, dd и yyyy в вопросе не являются стандартным синтаксисом формата даты php - я не уверен, что имеется в виду, поэтому я установил $ start_date с ISO год-месяц-день)
Полезно, когда у нас понедельник - первый день недели (пн-вс).
Камран Муштак
0
Я несколько раз сталкивался с этим вопросом и всегда удивлялся, что функции даты не делают его проще или яснее. Вот мое решение для PHP5, использующее этот DateTimeкласс:
/**
* @param DateTime $date A given date
* @param int $firstDay 0-6, Sun-Sat respectively
* @return DateTime
*/function getFirstDayOfWeek(DateTime $date, $firstDay =0){
$offset =7- $firstDay;
$ret = clone $date;
$ret->modify(-(($date->format('w')+ $offset)%7).'days');return $ret;}
Необходимо клонировать, чтобы не изменить исходную дату.
$date ="2013-03-18";
$searchRow = date("d.m.Y", strtotime('last monday',strtotime($date." + 1 day")));
echo "for date ".$date ." we get this monday: ";echo $searchRow; echo '<br>';
Это не лучший способ, но я тестировал, и если я на этой неделе, я получу правильный понедельник, а если я буду в понедельник, я получу этот понедельник.
DateTime
решения, но в большинстве ответов его не дает. =)Ответы:
Вот что я использую ...
$ day содержит число от 0 до 6, представляющее день недели (воскресенье = 0, понедельник = 1 и т. д.).
$ week_start содержит дату воскресенья текущей недели в формате мм-дд-гггг.
$ week_end содержит дату субботы текущей недели в формате мм-дд-гггг.
источник
Заменить время (). Методы "Следующее воскресенье / последний понедельник" не будут работать, если текущий день - воскресенье / понедельник.
источник
$monday = strtotime('last monday', strtotime('tomorrow'));
this week
не работает, если вам нужно всегда иметь предыдущее начало недели, но комментарий @LewisBuckley делает это.time()
необязателен, если вы хотите указать сегодня.Очень простая в использовании
strtotime
функция :В разных версиях PHP он немного отличается :
Вывод для 5.3.0 - 5.6.6, php7 @ 20140507-20150301, hhvm-3.3.1 - 3.5.1
Вывод для 4.3.5 - 5.2.17
Вывод для 4.3.0 - 4.3.4
Сравнение в крайних случаях
Относительные описания, подобные этой неделе, имеют свой собственный контекст. Ниже показаны выходные данные для понедельника и воскресенья этой недели, когда это понедельник или воскресенье:
Кстати, в разных версиях PHP он немного отличается :
Вывод для 5.3.0 - 5.6.6, php7 @ 20140507-20150301, hhvm-3.3.1 - 3.5.1
Вывод для 4.3.5 - 5.0.5, 5.2.0 - 5.2.17
Выход для 5.1.0 - 5.1.6
Вывод для 4.3.0 - 4.3.4
источник
Будь проще :
Источник: руководство по PHP.
NB: по мере того, как некоторые пользователи прокомментировали, значение $ dateTime будет изменено.
источник
$dateTime = new \DateTime('2012-05-14');
DateTime
класс, что означает, что код будет работать, даже если у вас есть другой класс, вызванныйDateTime
в текущем пространстве имен.Это дает вам день недели самой данной даты, где
0
= воскресенье и6
= суббота. Оттуда вы можете просто рассчитать в обратном направлении к желаемому дню.источник
На этот вопрос нужен хороший ответ DateTime : -
Вывод:-
Это будет иметь дело с границами года и високосными годами.
источник
РЕДАКТИРОВАТЬ: приведенная ниже ссылка больше не работает в указанной версии PHP. Он работает на PHP 5.6, что повышает надежность strtotime, но не идеально! Результаты в таблице являются живыми результатами PHP 5.6.
Как бы то ни было, вот анализ шаткого поведения strtotime при определении согласованной системы отсчета:
http://gamereplays.org/reference/strtotime.php
По сути, только эти строки будут надежно указывать вам одну и ту же дату, независимо от того, в какой день недели вы сейчас звоните:
источник
Следующий код должен работать с любой настраиваемой датой, просто используется желаемый формат даты.
Я тестировал код с помощью PHP 5.2.17. Результаты:
источник
Предполагая, что понедельник является первым днем недели, это работает:
источник
Как насчет этого?
источник
Это то, что я использую, чтобы получить первый и последний день недели с любой даты . В этом случае понедельник - это первый день недели ...
источник
Здесь я считаю воскресенье первым, а субботу - последним днем недели.
Вывод :
Начало: 08.05.2012
Конец: 08.11.2012
источник
Как насчет этого?
источник
Попробуй это:
(из этой ветки форума )
источник
Это самое короткое и удобочитаемое решение, которое я нашел:
strtotime
быстрее чемnew DateTime()->getTimestamp()
.источник
Просто используйте
date($format, strtotime($date,' LAST SUNDAY + 1 DAY'));
источник
Для данной версии PHP до 5.3 следующая функция дает вам первый день недели заданной даты (в данном случае - воскресенье, 03.02.2013):
источник
источник
Сначала вы должны получить следующий понедельник, а затем «последний понедельник» следующего понедельника. Таким образом, если заданная дата - понедельник, она вернет ту же дату, что и понедельник на прошлой неделе.
источник
Если вы хотите начать неделю с понедельника, сделайте следующее:
источник
Разумный способ сделать это - позволить PHP обрабатывать разницу в часовых поясах и переход на летнее время (DST). Позвольте мне показать вам, как это сделать.
Эта функция будет генерировать все дни с понедельника по пятницу включительно (удобно для генерации рабочих дней недели):
Это вернет время с понедельника по пятницу для текущей недели. Чтобы сделать то же самое для произвольной даты, передайте дату в качестве параметра
DateTimeUtilities ::getPeriodFromMondayUntilFriday
, таким образом:Интересует только понедельник, как спрашивал ОП?
источник
Вы анализируете дату, используя
strptime()
и используетеdate()
результат:источник
(Примечание: MM, dd и yyyy в вопросе не являются стандартным синтаксисом формата даты php - я не уверен, что имеется в виду, поэтому я установил $ start_date с ISO год-месяц-день)
источник
Другой способ сделать это ....
источник
Самый простой способ получить первый день (понедельник) текущей недели:
где 604800 - количество секунд за 1 неделю (60 * 60 * 24 * 7).
Этот код получите в следующий понедельник и уменьшите его на 1 неделю. Этот код будет работать в любой день недели. Даже если сегодня понедельник.
источник
Я нашел это довольно неприятным, учитывая, что мой часовой пояс - австралийский, и я
strtotime()
ненавижу свидания в Великобритании.Если текущий день - воскресенье, то
strtotime("monday this week")
вернется на следующий день.Чтобы преодолеть это:
источник
Вот один лайнер для первого дня прошлой недели и последнего дня прошлой недели в виде
DateTime
объекта.источник
источник
Я несколько раз сталкивался с этим вопросом и всегда удивлялся, что функции даты не делают его проще или яснее. Вот мое решение для PHP5, использующее этот
DateTime
класс:Необходимо клонировать, чтобы не изменить исходную дату.
источник
Что о:
Это не лучший способ, но я тестировал, и если я на этой неделе, я получу правильный понедельник, а если я буду в понедельник, я получу этот понедельник.
источник