Подтвердить что ты не робот

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

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

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

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

Выводит дату этой недели в понедельник, когда кажется, что она должна выводиться в прошлые недели в понедельник. Похоже, в этом случае PHP обрабатывает как воскресенье, так и понедельник как начало недели. Это сейчас понедельник, 10 декабря 2012 года или 2012-12-10. date('Y-m-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
4b9b3361

Ответ 1

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

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

Ответ 2

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

echo date("Y-m-d", strtotime(date('o-\\WW')));

Ответ 3

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

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

Ответ 4

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

if(date('N') == 7) { 
    $date = date('Y-m-d',strtotime('monday last week'));
} else {
    $date = date('Y-m-d',strtotime('monday this week'));
}

Ответ 5

  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.

Хороший день.

Ответ 6

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

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

попробуйте

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

Ответ 7

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

// 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("Y-m-d", $ts); // generate the date

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

Ответ 8

Если вам нужен последний понедельник:

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

Простое изменение для использования DateTime или даже указание другой даты для использования в качестве базы.

Ответ 9

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

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