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

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

Очень просто использовать strtotime function:

echo date("Y-m-d", strtotime('monday this week')), "\n";   

echo date("Y-m-d", 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("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";

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

Ответ 4

Держите его простым:

<?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

Ответ 5

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

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

Ответ 6

Этот вопрос нуждается в хорошем ответе DateTime: -

function firstDayOfWeek($date)
{
    $day = DateTime::createFromFormat('m-d-Y', $date);
    $day->setISODate((int)$day->format('o'), (int)$day->format('W'), 1);
    return $day->format('m-d-Y');
}

var_dump(firstDayOfWeek('06-13-2013'));

Вывод: -

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

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

Ответ 7

РЕДАКТИРОВАТЬ: приведенная ниже ссылка больше не работает на указанной версии PHP. Он работает на PHP 5.6, что повышает надежность strtotime, но не идеален! Результаты в таблице являются живыми результатами из PHP 5.6.

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

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

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

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

Ответ 8

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

$custom_date = strtotime( date('d-m-Y', strtotime('31-07-2012')) ); 
$week_start = date('d-m-Y', strtotime('this week last monday', $custom_date));
$week_end = date('d-m-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

Ответ 9

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

echo date("M-d-y", strtotime('last monday', strtotime('next week', time())));

Ответ 10

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

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

Ответ 11

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

$m = strtotime('06-08-2012');  
$today =   date('l', $m);  
$custom_date = strtotime( date('d-m-Y', $m) );   
if ($today == 'Sunday') {  
   $week_start = date("d-m-Y", $m);  
} else {  
  $week_start = date('d-m-Y', strtotime('this week last sunday', $custom_date));  
}  

if ($today == 'Saturday') {  
  $week_end = date("d-m-Y", $m);
} else {  
  $week_end = date('d-m-Y', strtotime('this week next saturday', $custom_date));  
}
echo '<br>Start: '. $week_start;  
echo '<br>End: '. $week_end;  

Выход:

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

Ответ 12

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

$date = date('Y-m-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');

Ответ 13

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

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

Ответ 14

Просто используйте date($format, strtotime($date,' LAST SUNDAY + 1 DAY'));

Ответ 15

Попробуйте следующее:

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)));

(from эта тема форума)

Ответ 16

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

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

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

Ответ 17

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

<?php
  function startOfWeek($aDate){
    $d=strtotime($aDate);
    return strtotime(date('Y-m-d',$d).' - '.date("w",$d).' days');
  }

  echo(date('Y-m-d',startOfWeek("2013-02-07")).'
');
?>

Ответ 18

$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"));

Ответ 19

$monday = date('d-m-Y',strtotime('last monday',strtotime('next monday',strtotime($date))));

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

Ответ 20

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

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

Ответ 21

Умный способ сделать это - позволить 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

Ответ 22

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

date('N', strptime('%m-%d-%g', $dateString));

Ответ 23

<?php
/* PHP 5.3.0 */

date_default_timezone_set('America/Denver'); //Set apprpriate timezone
$start_date = strtotime('2009-12-15'); //Set start date

//Today 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 year-month-day)

Ответ 24

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

$year = '2014';
$month = '02';
$day = '26';

$date = DateTime::createFromFormat('Y-m-d 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 Y-m-d H:i:s');

Ответ 25

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

strtotime("next Monday") - 604800;

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

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

Ответ 26

Я нашел это довольно расстраивающим, учитывая, что мой часовой пояс австралийский и что 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"));

Ответ 27

Здесь один вкладыш для первого дня прошлой недели и последний день прошлой недели в виде объекта DateTime.

$firstDay = (new \DateTime())->modify(sprintf('-%d day', date('w') + 7))
                             ->setTime(0, 0, 0);
$lastDay = (new \DateTime())->modify(sprintf('-%d day', date('w') + 1))
                            ->setTime(23, 59, 59);

Ответ 28

Я несколько раз выступал против этого вопроса и всегда удивлял, что функции даты не делают это проще или понятнее. Здесь мое решение для 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;
}

Необходимо клонировать, чтобы не изменять исходную дату.

Ответ 29

Как насчет:

$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>';

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

Ответ 30

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

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