Вот краткий обзор проблемы: по воскресеньям 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
Насколько я могу судить, это ошибка. Я не вижу логической причины, почему 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')));