trabajados restar para meses fechas entre diferencia dias calcular años php date datetime

php - para - restar fechas en excel 2016



Cómo enumerar todos los meses entre dos fechas (4)

Debe hacer una diferencia entre dos meses del mismo año y dos meses de años diferentes.

$year_min = substr($row[''contractStart''], 0, 4); $year_max = substr($row[''contractEnd''], 0, 4); $month_min = substr($row[''contractStart''], 5, 2); $month_min = substr($row[''contractEnd''], 5, 2); $period = array(); try { if ($year_min > $year_max) throw new Exception(); else if ($year_min == $year_max) if ($month_min > $month_max) throw new Exception(); for ($month = $month_min; $month <= $month_max; $month++) { $period[] = $month . ''-'' . $year; } else { for ($month = $month_min; $month <= 12; $month++) { $period[] = $month . ''-'' . $year_min; } for ($year = $year_min + 1; $year < $year_max; $year++) { for ($month = $month_min; $month <= $month_max; $month++) { $period[] = $month . ''-'' . $year; } } for ($month = 1; $month <= $month_max; $month++) { $period[] = $month . ''-'' . $year_max; } } implode("<br />/r/n", $period); } catch (Exception $e) { echo ''Start date occures after end date.'' }

Eso es por el camino difícil. Ahora hay una manera rápida y fácil que ya se ha dado como una respuesta que te recomiendo que elijas.

Estoy tratando de enumerar todos los meses entre dos fechas.

Por ejemplo; La fecha de inicio es: 2010-12-02 y la última fecha es: 2012-05-06

Quiero hacer una lista de algo como esto:

2010-12 2011-01 2011-02 2011-03 2011-04 . . . 2012-04 2012-05

Esto es lo que he intentado y no funciona en absoluto:

$year_min = 2010; $year_max = 2012; $month_min = 12; $month_max = 5; for($y=$year_min; $y<=$year_max; $y++) { for($m=$month_min; $m<=$month_max; $m++) { $period[] = $y.$m; } }


Esta fue mi solución ya que DateTime no está disponible en mi entorno de servidor.

$a = "2007-01-01"; $b = "2008-02-15"; $i = date("Ym", strtotime($a)); while($i <= date("Ym", strtotime($b))){ echo $i."/n"; if(substr($i, 4, 2) == "12") $i = (date("Y", strtotime($i."01")) + 1)."01"; else $i++; }

Pruébelo: http://3v4l.org/BZOmb


PHP 5.3

$start = new DateTime(''2010-12-02''); $start->modify(''first day of this month''); $end = new DateTime(''2012-05-06''); $end->modify(''first day of next month''); $interval = DateInterval::createFromDateString(''1 month''); $period = new DatePeriod($start, $interval, $end); foreach ($period as $dt) { echo $dt->format("Y-m") . "<br>/n"; }

Véalo en acción

PHP 5.4 o posterior

$start = (new DateTime(''2010-12-02''))->modify(''first day of this month''); $end = (new DateTime(''2012-05-06''))->modify(''first day of next month''); $interval = DateInterval::createFromDateString(''1 month''); $period = new DatePeriod($start, $interval, $end); foreach ($period as $dt) { echo $dt->format("Y-m") . "<br>/n"; }

La parte donde modificamos las fechas de inicio y finalización al primero del mes es importante. Si no lo hiciéramos, y el día actual más alto que el último día de febrero (es decir, 28 en años no bisiestos, 29 en años bisiestos) esto saltaría en febrero.


function getMonthsInRange($startDate, $endDate) { $months = array(); while (strtotime($startDate) <= strtotime($endDate)) { $months[] = array(''year'' => date(''Y'', strtotime($startDate)), ''month'' => date(''m'', strtotime($startDate)), ); $startDate = date(''d M Y'', strtotime($startDate. ''+ 1 month'')); } return $months; }