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";
}
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;
}