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
Ответы
Ответ 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')));