2010-03-02 3 views
5

В моем приложении в неделю определяется с понедельника 12:00:00 утра до воскресенья 11:59:59 PMPHP - функция Date - нахождение на прошлой неделе

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

Чтобы дать вам сценарии - - 1 марта Понедельник 12:00:00 до 7 марта Воскресенье 12:59:59 PM - неделя.

Теперь, когда пользователь посещает веб-сайт 8 марта или 10 марта или 12 марта - на основе текущей даты я должен быть в состоянии получить диапазон даты предыдущей недели, т.е. дату начала 1 марта и дату окончания 7 марта.

Но если пользователь посещает сайт, говорят 16 марта - диапазон дат, который мне понадобится, - с 8 марта по 15 марта.

Как это сделать в PHP. Благодаря

ответ

8

Вы можете попробовать сделать это с отметками времени, но это становится беспорядочным с изменениями часового пояса (например, CET -> CEST). Я бы использовать DateTime класс:

$d = new DateTime(); 
$weekday = $d->format('w'); 
$diff = 7 + ($weekday == 0 ? 6 : $weekday - 1); // Monday=0, Sunday=6 
$d->modify("-$diff day"); 
echo $d->format('Y-m-d') . ' - '; 
$d->modify('+6 day'); 
echo $d->format('Y-m-d'); 
+0

спасибо Lukas - это отлично работает – Gublooo

+1

Чтобы убрать дневной сдвиг, вы можете сделать '(6 + $ weekday)% 7' вместо' ($ weekday == 0? 6: $ weekday - 1) ' –

1
function get_week_start($year, $month, $day) 
{ 
    $timestamp = mktime(0, 0, 0, $month, $day, $year); 
    return date('F j Y', $timestamp = mktime(0, 0, 0, $month, date('d', $timestamp)-date('w', $timestamp), $year)); 
} 

Вы могли бы, возможно, добавить следующие 6 дней, и у вас есть.

+0

Благодаря Торп позвольте мне проверить его – Gublooo

8

strtotime функция очень удобна здесь:

$mondayStr = "last monday"; 
if (date('N') !== '1') { // it's not Monday today 
    $mondayStr .= " last week"; 
} 

$monday = strtotime($mondayStr); 
echo date('r', $monday); // Mon, 22 Feb 2010 00:00:00 +1000 

$sunday = strtotime('next monday', $monday) - 1; 
echo date('r', $sunday); // Sun, 28 Feb 2010 23:59:59 +1000 
+0

спасибо nick - я раньше не слышал об этой функции. Цените это – Gublooo

+0

@ Gublooo, с кодом раньше была небольшая ошибка: он получал бы * эту * неделю, если только сегодня не было понедельника. Теперь он исправлен. – nickf

+0

Это именно тот код, который я имел в виду под термином «попробуйте его с отметками времени» в моем ответе. Если вы живете в неправильной стране и запустите это в тот же день, вы получите сюрприз, потому что второй результат не будет 23:59:59 в воскресенье, но 00:59:59 в понедельник. Yay для DST. Если вам нужно использовать временные метки, по крайней мере убедитесь, что вы используете GMT. –

0

GMT версия

$prev_monday_t = time() - (gmdate('N') + 6) * 86400; 
$prev_sunday_t = time() - gmdate('N') * 86400; 

echo gmdate('Y-m-d H:i:s', $prev_monday_t).' '.gmdate('Y-m-d H:i:s', $prev_sunday_t); 

Локальная версия

$prev_monday_t = time() - (date('N') + 6) * 86400; 
$prev_sunday_t = time() - date('N') * 86400; 

echo date('Y-m-d H:i:s', $prev_monday_t).' '.date('Y-m-d H:i:s', $prev_sunday_t); 
Смежные вопросы