Ottieni inizio e fine giorni per una determinata settimana in PHP

Sto cercando di get l'intervallo della settimana usando domenica come data di inizio e una data di riferimento, ad esempio $date , ma non riesco proprio a capirlo.

Ad esempio, se avessi $ date come 2009-05-01, riceverei il 2009-04-26 e il 2009-05-02. Il 2009-05-10 produrrebbe il 2009-05-10 e il 2009-05-16. Il mio codice attuale assomiglia a questo (non mi ricordo da where l'ho tolto, dato che ho dimenticato di inserire l'url nei miei commenti):

 function x_week_range(&$start_date, &$end_date, $date) { $start_date = ''; $end_date = ''; $week = date('W', strtotime($date)); $week = $week; $start_date = $date; $i = 0; while(date('W', strtotime("-$i day")) >= $week) { $start_date = date('Ym-d', strtotime("-$i day")); $i++; } list($yr, $mo, $da) = explode('-', $start_date); $end_date = date('Ym-d', mktime(0, 0, 0, $mo, $da + 6, $yr)); } 

Mi sono reso conto che tutto ciò che ha fatto è stato aggiungere 7 giorni alla data corrente. come lo faresti?

Mi piacerebbe sfruttare la meraviglia strtotime di PHP:

 function x_week_range(&$start_date, &$end_date, $date) { $ts = strtotime($date); $start = (date('w', $ts) == 0) ? $ts : strtotime('last sunday', $ts); $start_date = date('Ym-d', $start); $end_date = date('Ym-d', strtotime('next saturday', $start)); } 

Testato sui dati forniti e funziona. Non mi piace particolarmente l'intera cosa di riferimento che stai facendo, però. Se questa fosse la mia function, vorrei che fosse così:

 function x_week_range($date) { $ts = strtotime($date); $start = (date('w', $ts) == 0) ? $ts : strtotime('last sunday', $ts); return arrays(date('Ym-d', $start), date('Ym-d', strtotime('next saturday', $start))); } 

E chiamalo così:

 list($start_date, $end_date) = x_week_range('2009-05-10'); 

Non sono un grande fan di fare math per cose come questa. Le date sono complicate e preferisco che PHP lo capisca.

Per tutti coloro che usano ancora mktime (), strtotime () e altre funzioni PHP … prova la class DateTime di PHP5. All'inizio ero titubante, ma è davvero facile da usare. Non dimenticare di usare clone () per copiare i tuoi oggetti.

Modifica: questo codice è stato modificato di recente per gestire il caso in cui il giorno corrente è domenica. In tal caso, dobbiamo passare lo scorso sabato e aggiungere un giorno per get la domenica.

 $dt_min = new DateTime("last saturday"); // Edit $dt_min->modify('+1 day'); // Edit $dt_max = clone($dt_min); $dt_max->modify('+6 days'); 

Quindi formatta come ti serve.

 echo 'This Week ('.$dt_min->format('m/d/Y').'-'.$dt_max->format('m/d/Y').')'; 

Assicurati di impostare il fuso orario in anticipo nel codice.

 date_default_timezone_set('America/New_York'); 

Apparentemente il valore di formattazione 'w' di date () o il metodo di formattazione di un object DateTime restituirà il giorno della settimana come un numero (per impostazione predefinita, 0 = domenica, 1 = lunedì, ecc.)

Puoi prendere questo e sottrarre il suo valore come giorni dal giorno corrente per trovare l'inizio della settimana.

 $start_date = new DateTime("2009-05-13"); $day_of_week = $start_date->format("w"); $start_date->modify("-$day_of_week day"); 

$ start_date sarà ora uguale alla domenica di quella settimana, da lì puoi aggiungere 7 giorni per get la fine della settimana o what-have-you.

Basandomi sulla risposta di @jjwdesign, ho sviluppato una function in grado di calcolare l'inizio e la fine di una settimana per una data specifica utilizzando la class DateTime. FUNZIONERÀ su PHP 5.3.0 ++

La differenza è che puoi impostare il giorno che vuoi come "inizio" tra 0 (lunedì) e 6 (domenica).

Ecco la function:

 if(function_exists('grk_Week_Range') === FALSE){ function grk_Week_Range($DateString, $FirstDay=6){ # Valeur par défaut si vide if(empty($DateString) === TRUE){ $DateString = date('Ym-d'); } # On va aller chercher le premier jour de la semaine qu'on veut $Days = arrays( 0 => 'monday', 1 => 'tuesday', 2 => 'wednesday', 3 => 'thursday', 4 => 'friday', 5 => 'saturday', 6 => 'sunday' ); # On va définir pour de bon le premier jour de la semaine $DT_Min = new DateTime('last '.(isset($Days[$FirstDay]) === TRUE ? $Days[$FirstDay] : $Days[6]).' '.$DateString); $DT_Max = clone($DT_Min); # On renvoie les données return arrays( $DT_Min->format('Ym-d'), $DT_Max->modify('+6 days')->format('Ym-d') ); } } 

Risultati:

 print_r(grk_Week_Range('2013-08-11 16:45:32', 0)); print_r(grk_Week_Range('2013-08-11 16:45:32', 1)); print_r(grk_Week_Range('2013-08-11 16:45:32', 2)); print_r(grk_Week_Range('2013-08-11 16:45:32', 3)); print_r(grk_Week_Range('2013-08-11 16:45:32', 4)); print_r(grk_Week_Range('2013-08-11 16:45:32', 5)); print_r(grk_Week_Range('2013-08-11 16:45:32', 6)); Array ( [0] => 2013-07-29 [1] => 2013-08-04 ) Array ( [0] => 2013-07-30 [1] => 2013-08-05 ) Array ( [0] => 2013-07-31 [1] => 2013-08-06 ) Array ( [0] => 2013-07-25 [1] => 2013-07-31 ) Array ( [0] => 2013-07-26 [1] => 2013-08-01 ) Array ( [0] => 2013-07-27 [1] => 2013-08-02 ) Array ( [0] => 2013-07-28 [1] => 2013-08-03 ) 

Ecco la mia versione, che usa una nozione simile a quella di Clay:

 /** * Start of the week * * 0 = Sun, 1 = Mon, etc. */ define( 'WEEK_START', 0 ); /** * Determine the start and end dates for * the week in which the specified date * falls * * @param $date Date in week * @param $start Week start (out) * @param $end Week end (out) */ function week_bounds( $date, &$start, &$end ) { $date = strtotime( $date ); // Find the start of the week, working backwards $start = $date; while( date( 'w', $start ) > WEEK_START ) { $start -= 86400; // One day } // End of the week is simply 6 days from the start $end = date( 'Ym-d', $start + ( 6 * 86400 ) ); $start = date( 'Ym-d', $start ); } 

Leggermente testato Il codice potrebbe non essere a prova di proiettile o gestire le date nel lontano passato o nel futuro. Utilizzare a proprio rischio. Non immergere il codice nell'acqua. Non mostrare il codice a quelli di una disposizione nervosa, o con l'odio del segno del dollaro. Non testato su animali. Sicuro per l'uso da parte dei vegetariani. L'autore garantisce che il codice non ti parlerà mai, mai. Nell'improbabile eventualità che il codice tenti di coinvolgerti in una conversazione, l'autore ti consiglia di ignorare each consiglio che dà.

Nel tentativo di trovare una versione più snella della risposta accettata da Paolo Bergantino, ho scoperto un modo davvero carino per get questo risultato:

 function x_week_range2($date) { $ts = strtotime($date); $start = strtotime('sunday this week -1 week', $ts); $end = strtotime('sunday this week', $ts); return arrays(date('Ym-d', $start), date('Ym-d', $end)); } 

La string "domenica di questa settimana" significa sempre "La domenica alla fine di questa settimana". Se utilizzato su un timestamp che cade di domenica, sarà la domenica successiva. Ciò consente di evitare la necessità dell'operatore ternario nella soluzione di Paola.

Usalo per get il numero "settimana" da una data specifica.

 //October 29, 2009 is my birthday echo $week date('W', strtotime('2009-10-29')); //OUTPUT: 44 //October 29 is the 44th week in the year 2009 

Ora passa i parametri per la function getWeekDates come "year (2009)" e "$ week".

 function getWeekDates($year, $week, $start=true){ $from = date("Ymd", strtotime("{$year}-W{$week}-1")); //Returns the date of monday in week $to = date("Ymd", strtotime("{$year}-W{$week}-7")); //Returns the date of sunday in week if($start) { return $from; } else { return $to; } //return "Week {$week} in {$year} is from {$from} to {$to}."; } 

Per maggiori informazioni Si prega di fare riferimento a questo link http://blog.ekini.net/2009/07/09/php-get-start-and-end-dates-of-a-week-from-datew/

Ora puoi utilizzare DateTime per get le date di inizio / fine della settimana (s)

 function getDateRangeForAllWeeks($start, $end){ $fweek = getDateRangeForWeek($start); $lweek = getDateRangeForWeek($end); $week_dates = []; while($fweek['sunday']!=$lweek['sunday']){ $week_dates [] = $fweek; $date = new DateTime($fweek['sunday']); $date->modify('next day'); $fweek = getDateRangeForWeek($date->format("Ymd")); } $week_dates [] = $lweek; return $week_dates; } function getDateRangeForWeek($date){ $dateTime = new DateTime($date); $monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week'); $sunday = clone $dateTime->modify('Sunday this week'); return ['monday'=>$monday->format("Ymd"), 'sunday'=>$sunday->format("Ymd")]; } 

uso

 print_r( getDateRangeForWeek("2016-05-07") ); print_r( getDateRangeForAllWeeks("2015-11-07", "2016-02-15") ); 

Per essere onesti, ho difficoltà a capire il codice che hai postato;)

Immagino che una cosa del genere dovrebbe fare il trucco:

 function get_week($date) { $start = strtotime($date) - strftime('%w', $date) * 24 * 60 * 60; $end = $start + 6 * 24 * 60 * 60; return arrays('start' => strftime('%Y-%m-%d', $start), 'end' => strftime('%Y-%m-%d', $end)); } 

Senza fare molta manipolazione delle stringhe, puoi fare dei semplici calcoli matematici con i timestamp.

 function getDateRange(&$start, &$end, $date) { $seconds_in_day = 86400; $day_of_week = date("w", $date); $start = $date - ($day_of_week * $seconds_in_day); $end = $date + ((6 - $day_of_week) * $seconds_in_day); } 

Basato sulla versione di David Bélanger (sfortunatamente, il mio rappresentante non mi permetterà di postare commenti come reazione al suo post ..).

Quando la data di inserimento è lunedì e il primo giorno della settimana è impostato come lunedì, la versione originale restituisce la settimana precedente, non corrente. Ecco la piccola correzione (con il resto della function orig.):

 if(function_exists('grk_Week_Range') === FALSE){ function grk_Week_Range($DateString, $FirstDay=6){ if(empty($DateString) === TRUE){ $DateString = date('Ym-d'); } # fix $dayOfWeek = date('N', strtotime($DateString)); if ($dayOfWeek == ($FirstDay +1)) { $whichWeek = 'this '; } else { $whichWeek = 'last '; } $Days = arrays( 0 => 'monday', 1 => 'tuesday', 2 => 'wednesday', 3 => 'thursday', 4 => 'friday', 5 => 'saturday', 6 => 'sunday' ); # fix $DT_Min = new DateTime( $whichWeek.(isset($Days[$FirstDay]) === TRUE ? $Days[$FirstDay] : $Days[6]).' '.$DateString); $DT_Max = clone($DT_Min); return arrays( $DT_Min->format('Ym-d'), $DT_Max->modify('+6 days')->format('Ym-d') ); } } 

da PHP DateTime doc:

 <?php $date = new DateTime(); $date->setISODate(2008, 2); $startDay = $date->format('Ym-d'); $date->setISODate(2008, 2, 7); $endDay = $date->format('Ym-d'); ?>