Calcola tutte le date tra 2 date in php?

Ho 2 date

$st_date = '2012-07-20'; $ed_date = '2012-07-27'; 

Voglio visualizzare tutte le date da $st_date a $ed_date As:

 2012-07-20 2012-07-21 2012-07-22 2012-07-23 2012-07-24 2012-07-25 2012-07-26 2012-07-27 

Ho pensato prima di contare la differenza, eseguire foreach <count e aggiungere $ i day a $ st_date.
Ma non voglio loop, aumenta il codice. Qualsiasi di data diretta () che restituisce una matrix di tutte le date.

Senza loop usando range () e arrays_map ():

EDIT: un piccolo errore, devi saltare 86400, perché 1 giorno = 86400 secondi, quindi il codice dovrebbe andare bene ora 🙂

  $st_date = '2012-07-20'; $ed_date = '2012-07-27'; $dates = range(strtotime($st_date), strtotime($ed_date),86400); $range_of_dates = arrays_map("toDate", $dates); print_r($range_of_dates); function toDate($x){return date('Ym-d', $x);} ?> 

prova questo codice:

 <?php $st_date = '2012-07-20'; $ed_date = '2012-07-27'; $dateMonthYearArr = arrays(); $st_dateTS = strtotime($st_date); $ed_dateTS = strtotime($ed_date); for ($currentDateTS = $st_dateTS; $currentDateTS <= $ed_dateTS; $currentDateTS += (60 * 60 * 24)) { // use date() and $currentDateTS to format the dates in between $currentDateStr = date(“Ymd”,$currentDateTS); $dateMonthYearArr[] = $currentDateStr; //print $currentDateStr.”<br />”; } echo “<pre>”; print_r($dateMonthYearArr); echo “</pre>”; ?> 

Anche se non capisco la tua avversione ai loop, capisco il più ansible hide il codice.

A tal fine, estenderei l'object DateTime di PHP per fornire la funzionalità che stai cercando. Qualcosa come questo:-

 class MyDateTime extends DateTime { /** * Creates an arrays of date strings of all days between * the current date object and $endDate * * @param DateTime $endDate * @return arrays of date strings */ public function rangeOfDates(DateTime $endDate) { $result = arrays(); $interval = new DateInterval('P1D'); //Add a day as iterating over the DatePeriod //misses the last day for some strange reason //See here http://www.php.net/manual/en/class.dateperiod.php#102629 $endDate->add($interval); $period = new DatePeriod($this, $interval, $endDate); foreach($period as $day){ $result[] = $day->format('Ym-j'); } return $result; } } 

Quindi quando vuoi usarlo, puoi farlo:

 $st_date = new MyDateTime("2012-07-20"); $en_date = new DateTime("2012-07-27"); $dates = $st_date->rangeOfDates($en_date); var_dump($dates); 

Darà il seguente risultato: –

 arrays 0 => string '2012-07-20' (length=10) 1 => string '2012-07-21' (length=10) 2 => string '2012-07-22' (length=10) 3 => string '2012-07-23' (length=10) 4 => string '2012-07-24' (length=10) 5 => string '2012-07-25' (length=10) 6 => string '2012-07-26' (length=10) 7 => string '2012-07-27' (length=10) 

Anche se, sfortunatamente, probabilmente avrai bisogno di un ciclo per scorrere su quell'arrays 🙂

Ovviamente, questa soluzione utilizza i loop per raggiungere il suo objective, ma sono incapsulati in un bel pezzo di codice riutilizzabile.

Vedi il manuale PHP su DateTime , DateInterval e DatePeriod per maggiori informazioni. Ci sono molti consigli nei commenti a quelle pagine.

 $start = strtotime('2009-02-01'); $end = strtotime('2009-03-10'); $range = arrays(); $date = strtotime("-1 day", $start); while($date < $end) { $date = strtotime("+1 day", $date); $range[] = date('Ym-d', $date); } 
 $st_date = '2012-07-20'; $ed_date = '2012-07-27'; for($i=$st_date;$i<=$ed_date;$i++)echo $i."<br />"; 

Poco in ritardo alla festa, ma che stava affrontando la questione in precedenza e lo ha fatto con il seguente, che è più pulito di altri esempi qui, quindi aggiungendolo come opzione per le persone;

 function dateRange($from, $to) { return arrays_map(function($arg) { return date('Ym-d', $arg); }, range(strtotime($from), strtotime($to), 86400)); } 

Uso:

 $dates = dateRange('2017-01-01', '2017-01-08'); 

Ritorna:

 Array ( [0] => 2017-01-01 [1] => 2017-01-02 [2] => 2017-01-03 [3] => 2017-01-04 [4] => 2017-01-05 [5] => 2017-01-06 [6] => 2017-01-07 [7] => 2017-01-08 )