2010-03-02 10 views
5

Nella mia applicazione di una settimana è definito dal Lunedi alla Domenica 12:00:00 11:59:59PHP - Data la funzione - trovando la settimana precedente

Ogni volta che un utente visita il mio sito - ho bisogno di trovare l'intervallo di date delle settimane precedenti e mostragli i risultati in base a questo. Sembra semplice ma sono perso.

Per fornire scenari - - 1 marzo lunedì 12:00:00 al 7 marzo domenica 12:59:59 PM è la settimana.

Ora, quando un utente visita il sito Web l'8 marzo o il 10 marzo o il 12 marzo, in base alla data corrente, dovrei essere in grado di ottenere l'intervallo di date della settimana precedente, vale a dire la data di inizio 1 marzo e la data di fine 7 marzo.

Ma se l'utente visita il sito, il 16 marzo, l'intervallo di date di cui ho bisogno è dall'8 marzo al 15 marzo.

Come posso farlo in PHP. Grazie

risposta

8

Si potrebbe provare a farlo con i timestamp, ma ciò si confonde con i cambiamenti del fuso orario (ad esempio, CET -> CEST). Userei la classe 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

Grazie Lukas - che funziona perfettamente – Gublooo

+1

Per riorganizzare il cambio diurno, è possibile fare '(6 + $ giorno della settimana)% 7' invece di' ($ giorno feriale == 0? 6: $ nei giorni feriali - 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)); 
} 

Si potrebbe forse aggiungere i prossimi 6 giorni e lo avete.

+0

Grazie Thorpe fammi controllare fuori – Gublooo

8

La funzione strtotime è molto utile qui:

$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

grazie nick - non avevo mai sentito parlare di questa funzione prima. Apprezzo il numero – Gublooo

+0

@Gublooo, c'è stato un piccolo errore con il codice precedente: otterrebbe * questa * settimana, a meno che oggi fosse lunedì. Ora è riparato. – nickf

+0

Questo è esattamente il tipo di codice che intendevo per "provalo con i timestamp" nella mia risposta. Se vivi nel paese sbagliato e lo fai nel giorno sbagliato, riceverai una sorpresa, perché il secondo risultato non sarà di 23:59:59 di domenica, ma di lunedì alle 00:59:59. Yay per l'ora legale. Se devi utilizzare i timestamp, assicurati almeno di utilizzare GMT. –

0

GMT versione

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

versione locale

$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); 
Problemi correlati