php - sumar - incrementar la fecha por un mes
sumar meses a una fecha php (13)
Digamos que tengo una fecha en el siguiente formato: 2010-12-11 (year-mon-day)
Con PHP, quiero incrementar la fecha en un mes, y quiero que el año se incremente automáticamente, si es necesario (es decir, incrementándose de diciembre de 2012 a enero de 2013).
Saludos.
Gracias, Jason, tu publicación fue muy útil. Lo reformaté y agregué más comentarios para ayudarme a entenderlo todo. En caso de que eso ayude a alguien, lo he publicado aquí:
function cycle_end_date($cycle_start_date, $months) {
$cycle_start_date_object = new DateTime($cycle_start_date);
//Find the date interval that we will need to add to the start date
$date_interval = find_date_interval($months, $cycle_start_date_object);
//Add this date interval to the current date (the DateTime class handles remaining complexity like year-ends)
$cycle_end_date_object = $cycle_start_date_object->add($date_interval);
//Subtract (sub) 1 day from date
$cycle_end_date_object->sub(new DateInterval(''P1D''));
//Format final date to Y-m-d
$cycle_end_date = $cycle_end_date_object->format(''Y-m-d'');
return $cycle_end_date;
}
//Find the date interval we need to add to start date to get end date
function find_date_interval($n_months, DateTime $cycle_start_date_object) {
//Create new datetime object identical to inputted one
$date_of_last_day_next_month = new DateTime($cycle_start_date_object->format(''Y-m-d''));
//And modify it so it is the date of the last day of the next month
$date_of_last_day_next_month->modify(''last day of +''.$n_months.'' month'');
//If the day of inputted date (e.g. 31) is greater than last day of next month (e.g. 28)
if($cycle_start_date_object->format(''d'') > $date_of_last_day_next_month->format(''d'')) {
//Return a DateInterval object equal to the number of days difference
return $cycle_start_date_object->diff($date_of_last_day_next_month);
//Otherwise the date is easy and we can just add a month to it
} else {
//Return a DateInterval object equal to a period (P) of 1 month (M)
return new DateInterval(''P''.$n_months.''M'');
}
}
$cycle_start_date = ''2014-01-31''; // select date in Y-m-d format
$n_months = 1; // choose how many months you want to move ahead
$cycle_end_date = cycle_end_date($cycle_start_date, $n_months); // output: 2014-07-02
Necesitaba una funcionalidad similar, excepto por un ciclo mensual (más meses, menos 1 día). Después de buscar SO por un tiempo, pude crear esta solución plug-n-play:
function add_months($months, DateTime $dateObject)
{
$next = new DateTime($dateObject->format(''Y-m-d''));
$next->modify(''last day of +''.$months.'' month'');
if($dateObject->format(''d'') > $next->format(''d'')) {
return $dateObject->diff($next);
} else {
return new DateInterval(''P''.$months.''M'');
}
}
function endCycle($d1, $months)
{
$date = new DateTime($d1);
// call second function to add the months
$newDate = $date->add(add_months($months, $date));
// goes back 1 day from date, remove if you want same day of month
$newDate->sub(new DateInterval(''P1D''));
//formats final date to Y-m-d form
$dateReturned = $newDate->format(''Y-m-d'');
return $dateReturned;
}
Ejemplo:
$startDate = ''2014-06-03''; // select date in Y-m-d format
$nMonths = 1; // choose how many months you want to move ahead
$final = endCycle($startDate, $nMonths); // output: 2014-07-02
Para cualquiera que busque una respuesta a cualquier formato de fecha.
echo date_create_from_format(''d/m/Y'', ''15/04/2017'')->add(new DateInterval(''P1M''))->format(''d/m/Y'');
Solo cambia el formato de fecha.
Primero configura el formato de fecha como 12-12-2012
Después de usar esta función, funciona correctamente;
$date = date(''d-m-Y'',strtotime("12-12-2012 +2 Months");
Aquí 12-12-2012 es su fecha y +2 meses es el incremento del mes;
También aumenta de año, fecha
strtotime("12-12-2012 +1 Year");
Ans es 12-12-2013
Puede usar DateTime::modify
así:
$date = new DateTime(''2010-12-11'');
$date->modify(''+1 month'');
Ver documentaciones:
Use DateTime::add
.
$start = new DateTime("2010-12-11", new DateTimeZone("UTC"));
$month_later = clone $start;
$month_later->add(new DateInterval("P1M"));
Utilicé clone porque add modifica el objeto original, lo que podría no ser deseable.
Yo uso de esta manera:
$occDate=''2014-01-28'';
$forOdNextMonth= date(''m'', strtotime("+1 month", strtotime($occDate)));
//Output:- $forOdNextMonth=02
/*****************more example****************/
$occDate=''2014-12-28'';
$forOdNextMonth= date(''m'', strtotime("+1 month", strtotime($occDate)));
//Output:- $forOdNextMonth=01
//***********************wrong way**********************************//
$forOdNextMonth= date(''m'', strtotime("+1 month", $occDate));
//Output:- $forOdNextMonth=02; //instead of $forOdNextMonth=01;
//******************************************************************//
poner una fecha en el cuadro de entrada y luego hacer clic en el botón obtener día a partir de la fecha en jquery
$(document).ready( function() {
$("button").click(function(){
var day = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
var a = new Date();
$(".result").text(day[a.getDay()]);
});
});
$date = strtotime("2017-12-11");
$newDate = date("Y-m-d", strtotime("+1 month", $date));
Si desea incrementar por días, también puede hacerlo
$date = strtotime("2017-12-11");
$newDate = date("Y-m-d", strtotime("+5 day", $date));
$time = strtotime("2010.12.11");
$final = date("Y-m-d", strtotime("+1 month", $time));
// Finally you will have the date you''re looking for.
(date(''d'') > 28) ? date("mdY", strtotime("last day of next month")) : date("mdY", strtotime("+1 month"));
Esto compensará los meses de febrero y los otros 31 días. Por supuesto, puede hacer muchas más comprobaciones para obtener los formatos de fechas relativas a "este día el próximo mes" (lo que no funciona tristemente, ver más abajo), y también podría usar DateTime.
Tanto DateInterval(''P1M'')
como strtotime("+1 month")
básicamente agregan ciegamente 31 días, independientemente de la cantidad de días del mes siguiente.
- 2010-01-31 => 3 de marzo
- 2012-01-31 => 2 de marzo (año bisiesto)
function dayOfWeek($date){
return DateTime::createFromFormat(''Y-m-d'', $date)->format(''N'');
}
Ejemplos de uso:
echo dayOfWeek(2016-12-22);
// "4"
echo dayOfWeek(date(''Y-m-d''));
// "4"
strtotime( "+1 month", strtotime( $time ) );
esto devuelve una marca de tiempo que se puede usar con la función de fecha