PHP: неделя начинается в понедельник, но «понедельник на этой неделе» в воскресенье будет понедельник на следующей неделе

Вот краткий обзор проблемы: по воскресеньям strtotime('this week') возвращает начало следующей недели.

В PHP неделя начинается с понедельника. Но в любой день, кроме воскресенья, этот код

 echo date('Ym-d', strtotime('monday this week', strtotime('last sunday'))); 

Выводит дату на этой неделе в понедельник, когда кажется, что она должна выводиться в прошлые недели в понедельник. Похоже, в этом случае PHP обрабатывает как воскресенье, так и понедельник как начало недели. Сейчас понедельник, 10 декабря 2012 года или 2012-12-10. date('Ym-d', strtotime('sunday last week')) возвращает 2012-12-09 – вчера.

Это ошибка, или я чего-то не хватает? Кажется, что эта ошибка очевидна, но я ничего не могу с ней поделать. Это единственный способ получить начало недели, чтобы использовать специальную обработку по воскресеньям?

 $week_offset = (int) 'sunday' == date('l'); $week_start = strtotime("-$week_offset monday"); // 1 or 0 Mondays ago 

Solutions Collecting From Web of "PHP: неделя начинается в понедельник, но «понедельник на этой неделе» в воскресенье будет понедельник на следующей неделе"

Насколько я могу судить, это ошибка. Я не вижу логической причины, почему strtotime('this week'); должен возвращать будущую дату. Это довольно серьезная ошибка. В моем конкретном случае у меня была таблица лидеров, которая показывала пользователям наибольшее количество очков с начала недели. Но по воскресеньям он был пуст, потому что strtotime вернул strtotime времени для будущей даты. Я сомневался, потому что просто не знаю, как это могло остаться незамеченным, но я не мог найти никаких других сообщений об этой ошибке.

Спасибо за все ваше время и помощь, ребята.

Вот как вы можете получить понедельник текущей недели:

 echo date("Ymd", strtotime(date('o-\\WW'))); 

Этот ответ запоздал, но с этим я боролся. Каждое решение, которое я пробовал до сих пор, по какой-то причине сработало. Это то, что я закончил, и это сработало для меня. (хотя это может выглядеть красиво, по крайней мере, работает).

 $thisMonday = strtotime('next Monday -1 week', strtotime('this sunday')); 

Это не идеально, но это то, к чему я прибегал:

 if(date('N') == 7) { $date = date('Ym-d',strtotime('monday last week')); } else { $date = date('Ym-d',strtotime('monday this week')); } 
  I think the only problem with your coding is TimeZone. 

Решение:
Установите свой собственный часовой пояс. Вот пример моего часового пояса:

пример

  date_default_timezone_set('Asia/Kolkata'); Set the above line before calling any time function. 

Хорошего дня.

Я думаю, вместо того, чтобы пытаться

 echo date('Ym-d', strtotime('monday this week', strtotime('last sunday'))); 

Ты должен попытаться

 echo date('Ym-d', strtotime('monday last week')); 

Попробуйте этот код

 // set current date $date = date("m/d/Y"); $ts = strtotime($date); // also $ts = time(); // find the year and the current week $year = date('o', $ts); $week = date('W', $ts); // print week for the current date $i = 1; // 1 denotes the first day of week $ts = strtotime($year.'W'.$week.$i); echo $day = date("l", $ts); // generate the name of day echo "<br>"; echo $day = date("Ymd", $ts); // generate the date 

Вы получите дату текущей недели, будь вы в понедельник, вы получите дату этого понедельника.

Если вы хотите последний понедельник:

 function mostRecentMonday(){ if(date("w") == 1){ return strtotime("midnight today"); } else { return strtotime("last monday"); } } 

Легко модифицировать, чтобы использовать DateTime, или даже указать другую дату для использования в качестве базы.

На основании ответа Брайанта :

 $first_week_date = date('d F Y', strtotime('next Monday -1 week', strtotime('this sunday'))); $last_week_date = date('d F Y', strtotime('next Monday -1 week + 6 days', strtotime('this sunday')));