Получить первый день недели в PHP?

Учитывая формат даты MM-dd-yyyy , может ли кто-нибудь помочь мне получить первый день недели?

Вот что я использую …

 $day = date('w'); $week_start = date('md-Y', strtotime('-'.$day.' days')); $week_end = date('md-Y', strtotime('+'.(6-$day).' days')); 

$ day содержит число от 0 до 6, представляющее день недели (воскресенье = 0, понедельник = 1 и т. д.).
$ week_start содержит дату для воскресенья текущей недели как mm-dd-yyyy.
$ week_end содержит дату субботы текущей недели как mm-dd-yyyy.

 strtotime('this week', time()); 

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

Очень простая в использовании функция strtotime :

 echo date("Ymd", strtotime('monday this week')), "\n"; echo date("Ymd", strtotime('sunday this week')), "\n"; 

Он немного отличается от версий PHP :

Выход для 5.3.0 – 5.6.6, php7 @ 20140507 – 20150301, hhvm-3.3.1 – 3.5.1

 2015-03-16 2015-03-22 

Выход для 4.3.5 – 5.2.17

 2015-03-23 2015-03-22 

Выход для 4.3.0 – 4.3.4

 2015-03-30 2015-03-29 

Сравнение в Edge-Cases

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

 $date = '2015-03-16'; // monday echo date("Ymd", strtotime('monday this week', strtotime($date))), "\n"; echo date("Ymd", strtotime('sunday this week', strtotime($date))), "\n"; $date = '2015-03-22'; // sunday echo date("Ymd", strtotime('monday this week', strtotime($date))), "\n"; echo date("Ymd", strtotime('sunday this week', strtotime($date))), "\n"; 

Againt немного отличается от версий PHP :

Выход для 5.3.0 – 5.6.6, php7 @ 20140507 – 20150301, hhvm-3.3.1 – 3.5.1

 2015-03-16 2015-03-22 2015-03-23 2015-03-29 

Выход для 4.3.5 – 5.0.5, 5.2.0 – 5.2.17

 2015-03-16 2015-03-22 2015-03-23 2015-03-22 

Выход для 5.1.0 – 5.1.6

 2015-03-23 2015-03-22 2015-03-23 2015-03-29 

Выход для 4.3.0 – 4.3.4

 2015-03-23 2015-03-29 2015-03-30 2015-03-29 

Будь проще :

 <?php $dateTime = new \DateTime('2012-05-14'); $monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week'); $sunday = clone $dateTime->modify('Sunday this week'); ?> 

Источник: руководство по PHP

 $givenday = date("w", mktime(0, 0, 0, MM, dd, yyyy)); 

Это дает вам день недели самой даты, где 0 = воскресенье и 6 = суббота. Оттуда вы можете просто рассчитать назад до того дня, когда захотите.

Для чего это стоит, вот разбивка неуклюжего поведения strtotime при определении согласованной системы отсчета:

http://gamereplays.org/reference/strtotime.php

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

 strtotime("next monday"); strtotime("this sunday"); strtotime("last sunday"); 

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

 $custom_date = strtotime( date('dm-Y', strtotime('31-07-2012')) ); $week_start = date('dm-Y', strtotime('this week last monday', $custom_date)); $week_end = date('dm-Y', strtotime('this week next sunday', $custom_date)); echo '<br>Start: '. $week_start; echo '<br>End: '. $week_end; 

Я проверил код с PHP 5.2.17 Результаты:

 Start: 30-07-2012 End: 05-08-2012 

Этот вопрос требует хорошего ответа DateTime : –

 function firstDayOfWeek($date) { $day = DateTime::createFromFormat('md-Y', $date); $day->setISODate((int)$day->format('o'), (int)$day->format('W'), 1); return $day->format('md-Y'); } var_dump(firstDayOfWeek('06-13-2013')); 

Вывод:-

 string '06-10-2013' (length=10) 

Это будет касаться границ года и високосных годов.

Как насчет этого?

 $first_day_of_week = date('md-Y', strtotime('Last Monday', time())); $last_day_of_week = date('md-Y', strtotime('Next Sunday', time())); 

Здесь я рассматриваю воскресенье как первую и субботу как последний день недели.

 $m = strtotime('06-08-2012'); $today = date('l', $m); $custom_date = strtotime( date('dm-Y', $m) ); if ($today == 'Sunday') { $week_start = date("dmY", $m); } else { $week_start = date('dm-Y', strtotime('this week last sunday', $custom_date)); } if ($today == 'Saturday') { $week_end = date("dmY", $m); } else { $week_end = date('dm-Y', strtotime('this week next saturday', $custom_date)); } echo '<br>Start: '. $week_start; echo '<br>End: '. $week_end; 

Вывод :

Начало: 05-08-2012
Конец: 11-08-2012

Предполагая, что понедельник в первый день недели, это работает:

 echo date("Mdy", strtotime('last monday', strtotime('next week', time()))); 

Как насчет этого?

 $day_of_week = date('N', strtotime($string_date)); $week_first_day = date('Ym-d', strtotime($string_date . " - " . ($day_of_week - 1) . " days")); $week_last_day = date('Ym-d', strtotime($string_date . " + " . (7 - $day_of_week) . " days")); 

Это то, что я использую, чтобы получить первый и последний день недели с любой даты . В этом случае понедельник – первый день недели …

 $date = date('Ym-d') // you can put any date you want $nbDay = date('N', strtotime($date)); $monday = new DateTime($date); $sunday = new DateTime($date); $monday->modify('-'.($nbDay-1).' days'); $sunday->modify('+'.(7-$nbDay).' days'); 

Попробуй это:

 function week_start_date($wk_num, $yr, $first = 1, $format = 'F d, Y') { $wk_ts = strtotime('+' . $wk_num . ' weeks', strtotime($yr . '0101')); $mon_ts = strtotime('-' . date('w', $wk_ts) + $first . ' days', $wk_ts); return date($format, $mon_ts); } $sStartDate = week_start_date($week_number, $year); $sEndDate = date('F d, Y', strtotime('+6 days', strtotime($sStartDate))); 

(из этой темы )

Это кратчайшее и наиболее читаемое решение, которое я нашел:

  <?php $weekstart = strtotime('monday this week'); $weekstop = strtotime('sunday this week 23:59:59'); //echo date('dmY H:i:s', $weekstart) .' - '. date('dmY H:i:s', $weekstop); ?> 

strtotime быстрее, чем new DateTime()->getTimestamp() .

Данная версия PHP версии 5.3 следующая функция дает вам первый день недели данной даты (в данном случае – воскресенье, 2013-02-03):

 <?php function startOfWeek($aDate){ $d=strtotime($aDate); return strtotime(date('Ym-d',$d).' - '.date("w",$d).' days'); } echo(date('Ym-d',startOfWeek("2013-02-07")).' '); ?> 
 $today_day = date('D'); //Or add your own date $start_of_week = date('Ymd'); $end_of_week = date('Ymd'); if($today_day != "Mon") $start_of_week = date('Ymd', strtotime("last monday")); if($today_day != "Sun") $end_of_week = date('Ymd', strtotime("next sunday")); 
 $monday = date('dm-Y',strtotime('last monday',strtotime('next monday',strtotime($date)))); 

Сначала вы должны получить следующий понедельник, а затем получить «последний понедельник» следующего понедельника. Поэтому, если данная дата понедельника, она вернется с той же даты не на прошлой неделе в понедельник.

Если вы хотите понедельника в качестве начала своей недели, сделайте следующее:

 $date = '2015-10-12'; $day = date('N', strtotime($date)); $week_start = date('Ym-d', strtotime('-'.($day-1).' days', strtotime($date))); $week_end = date('Ym-d', strtotime('+'.(7-$day).' days', strtotime($date))); 

Вы анализируете дату с использованием strptime() и используете date() для результата:

 date('N', strptime('%m-%d-%g', $dateString)); 
 <?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('md-Y', $today_or_previous_sunday); ?> 

(Примечание: MM, dd и yyyy в вопросе не являются стандартным синтаксисом формата даты php – я не могу быть уверен в том, что имеется в виду, поэтому я установил $ start_date с ISO year-month-day)

Другой способ сделать это ….

 $year = '2014'; $month = '02'; $day = '26'; $date = DateTime::createFromFormat('Ymd H:i:s', $year . '-' . $month . '-' . $day . '00:00:00'); $day = date('w', $date->getTimestamp()); // 0=Sunday 6=Saturday if($day!=0){ $newdate = $date->getTimestamp() - $day * 86400; //86400 seconds in a day // Look for DST change if($old = date('I', $date->getTimestamp()) != $new = date('I', $newdate)){ if($old == 0){ $newdate -= 3600; //3600 seconds in an hour } else { $newdate += 3600; } } $date->setTimestamp($newdate); } echo $date->format('D Ymd H:i:s'); - $year = '2014'; $month = '02'; $day = '26'; $date = DateTime::createFromFormat('Ymd H:i:s', $year . '-' . $month . '-' . $day . '00:00:00'); $day = date('w', $date->getTimestamp()); // 0=Sunday 6=Saturday if($day!=0){ $newdate = $date->getTimestamp() - $day * 86400; //86400 seconds in a day // Look for DST change if($old = date('I', $date->getTimestamp()) != $new = date('I', $newdate)){ if($old == 0){ $newdate -= 3600; //3600 seconds in an hour } else { $newdate += 3600; } } $date->setTimestamp($newdate); } echo $date->format('D Ymd H:i:s'); 

Самый простой способ получить первый день (понедельник) текущей недели:

 strtotime("next Monday") - 604800; 

где 604800 – количество секунд в 1 неделю (60 * 60 * 24 * 7).

Этот код получит следующий понедельник и уменьшит его на 1 неделю. Этот код будет работать в любой день недели. Даже если сегодня понедельник.

Я нашел это довольно разочаровывающим, учитывая, что мой часовой пояс – австралиец, и strtotime() ненавидит британские даты.

Если текущий день – воскресенье, то strtotime("monday this week") вернется на следующий день.

Чтобы преодолеть это:

Предостережение : Это справедливо только для австралийских / британских дат

 $startOfWeek = (date('l') == 'Monday') ? date('d/m/Y 00:00') : date('d/m/Y', strtotime("last monday 00:00")); $endOfWeek = (date('l') == 'Sunday') ? date('d/m/Y 23:59:59') : date('d/m/Y', strtotime("sunday 23:59:59")); 

Умный способ сделать это – позволить PHP обрабатывать разницу в часовых поясах и летнее время (DST). Позвольте мне показать вам, как это сделать.

Эта функция будет генерировать все дни с понедельника по пятницу включительно (удобно для создания рабочих дней недели):

 class DateTimeUtilities { public static function getPeriodFromMondayUntilFriday($offset = 'now') { $now = new \DateTimeImmutable($offset, new \DateTimeZone('UTC')); $today = $now->setTime(0, 0, 1); $daysFromMonday = $today->format('N') - 1; $monday = $today->sub(new \DateInterval(sprintf('P%dD', $daysFromMonday))); $saturday = $monday->add(new \DateInterval('P5D')); return new \DatePeriod($monday, new \DateInterval('P1D'), $saturday); } } foreach (DateTimeUtilities::getPeriodFromMondayUntilFriday() as $day) { print $day->format('c'); print PHP_EOL; } 

Это вернется с понедельника по пятницу на текущую неделю. Чтобы сделать то же самое для произвольной даты, передайте дату в качестве параметра DateTimeUtilities ::getPeriodFromMondayUntilFriday , таким образом:

 foreach (DateTimeUtilities::getPeriodFromMondayUntilFriday('2017-01-02T15:05:21+00:00') as $day) { print $day->format('c'); print PHP_EOL; } //prints //2017-01-02T00:00:01+00:00 //2017-01-03T00:00:01+00:00 //2017-01-04T00:00:01+00:00 //2017-01-05T00:00:01+00:00 //2017-01-06T00:00:01+00:00 

Только интересуется в понедельник, как спрашивал ОП?

 $monday = DateTimeUtilities::getPeriodFromMondayUntilFriday('2017-01-02T15:05:21+00:00')->getStartDate()->format('c'); print $monday; // prints //2017-01-02T00:00:01+00:00 

Я несколько раз выступал против этого вопроса и всегда удивлял, что функции даты не делают это проще или понятнее. Вот мое решение для 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("dmY", strtotime('last monday',strtotime($date." + 1 day"))); echo "for date " .$date ." we get this monday: " ;echo $searchRow; echo '<br>'; 

Это не лучший способ, но я тестировал, и если я на этой неделе, я получу правильный понедельник, и если я нахожусь в понедельник, я получу это в понедельник.

Я нашел это решение полезным. Просто вычтите, если это не в понедельник, чтобы получить предыдущий понедельник. Я использую $ lower_date как дату, которую я вытащил из запроса, который мне тогда нужно согласовать с предыдущим понедельником.

 //set this up to go backwards until you find monday while(date('D',strtotime($lower_date))!='Mon'){ $lower_date = date('Ym-d', strtotime($lower_date . ' - 1 day')); //increase the upper spec } в //set this up to go backwards until you find monday while(date('D',strtotime($lower_date))!='Mon'){ $lower_date = date('Ym-d', strtotime($lower_date . ' - 1 day')); //increase the upper spec } 

этот готовится на сегодня по понедельникам

 function lastMonday(\DateTime $date) { $timestamp = $date->getTimestamp(); $monday = ( 1 == date( 'N', $timestamp )); if ($monday) { return $timestamp; } else { return strtotime( 'last monday', $timestamp ); } } 

если вы хотите, чтобы вместо timestamp вместо DateTime изменялись первые две строки (избавиться от date-> getTimestamp), измените их только на это

 function lastMonday($timestamp) { 

и если вы хотите, чтобы он вводил изменение строки, сначала две строки к этому

 function lastMonday($dateString) { $timestamp = strtotime($dateString); 

Я искал решение, подобное этому, и я наконец придумал что-то, что вернется каждый день текущей недели.

 //set current timestamp $today = time(); //calculate the number of days since Monday $dow = date('w', $today); $offset = $dow - 1; if ($offset < 0) { $offset = 6; } //calculate timestamp for Monday and Sunday $monday = $today - ($offset * 86400); $tuesday = $monday + (1 * 86400); $wednesday = $monday + (2 * 86400); $thursday = $monday + (3 * 86400); $friday = $monday + (4 * 86400); $saturday = $monday + (5 * 86400); $sunday = $monday + (6 * 86400); //print dates for Monday and Sunday in the current week print date("Ymd", $monday) . "\n"; print date("Ymd", $tuesday) . "\n"; print date("Ymd", $wednesday) . "\n"; print date("Ymd", $thursday) . "\n"; print date("Ymd", $friday) . "\n"; print date("Ymd", $saturday) . "\n"; print date("Ymd", $sunday) . "\n"; 

Спасибо dbunic, который разместил это здесь: http://www.redips.net/php/week-list-current-date/#comments