El próximo mes, el mismo día en PHP

Tengo un “evento” que debe progtwigrse el mismo día de cada mes.

Digamos que estableces la fecha de inicio el 1 de mayo. Debes recibir los próximos eventos el 1 de junio, 1 de julio, etc. El problema viene con una fecha de inicio el día 31 (los próximos podrían ser 30 o 28 dependiendo del mes). .

Teniendo en cuenta que hay meses con diferentes números de días (28, 30, 31) dependiendo del mes en sí y del año … ¿cuál sería una manera fácil de configurar esto?

Considere la siguiente (y defectuosa) función nextmonth:

$events = array() function nextmonth($date) { return $date+(60*60*24*30); } $curr = $start; while($curr < $end) { $events[ = $curr; $curr = nextmonth($curr); } 

Editado para agregar: El problema para mí es, simplemente, cómo resolver cuál es el número de días de un mes dado y así obtener la próxima fecha correspondiente.

Actualizar:

Esto le dará la cantidad de días en un mes dado:

 echo date('t', $timestamp); 

Ver: fecha ()

Respuesta anterior:

No estoy seguro del algoritmo en el que está pensando, pero creo que esto lo ayudará a:

 echo date('dM-y', strtotime('next month')); 

Esto devolverá la marca de tiempo apropiada por $ X meses más adelante: mktime(0,0,0,date("m")+$X,date('d'),date("Y"));

Prueba esto. reday es el día para rellenar (int – día del mes). Si es menor que hoy, dará el reday de este mes pero no mucho más que no. de este mes días. Si es más de hoy, reday mismo mes del mismo mes. Utilizo esto para calcular “Siguiente recarga” del punto de recarga mensual. el retorno es dd/mm/yyyy

 function nextrefill($reday) { if (date("j") < $reday) { $numd = date("t"); if ($reday > $numd) { return str_pad($numd, 2, "0", STR_PAD_LEFT).date("/m/Y"); } else { return str_pad($reday, 2, "0", STR_PAD_LEFT).date("/m/Y"); } } else { $nextm = date('m', strtotime('first day of next month')); $nextmy = date('Y', strtotime('first day of next month')); $numd = cal_days_in_month(CAL_GREGORIAN, $nextm, $nextmy); if ($reday > $numd) { return str_pad($numd, 2, "0", STR_PAD_LEFT)."/".$nextm."/".$nextmy; } else { return str_pad($reday, 2, "0", STR_PAD_LEFT)."/".$nextm."/".$nextmy; } } } 

para más directo al punto (Editar)

 function nextmonthday($day) { $next_month = date('m', strtotime('first day of next month')); $year_of_next_month = date('Y', strtotime('first day of next month')); $no_of_day_in_next_month = cal_days_in_month(CAL_GREGORIAN, $nextm, $nextmy); if ($day > $no_of_day_in_next_month){ return str_pad($no_of_day_in_next_month, 2, "0", STR_PAD_LEFT)."/".$next_month."/".$year_of_next_month; } else { return str_pad($day, 2, "0", STR_PAD_LEFT)."/".$next_month."/".$year_of_next_month; } } 

Recomiendo leer el siguiente comentario en php.net. strtotime () (php.net)

Editar: La siguiente respuesta da el “resumen” del enlace que publiqué para aquellos que no pueden descifrar el contenido que se muestra allí.

Dado que los meses son muy variados, ¿no sería la mejor manera de establecer el próximo mes algo así como: este día, el próximo mes, excepto si este día no existe el próximo mes?

Ejemplo:

 June 5, 2009, next month would be July 5, 2009 August 31, 2009, next month would be September 30, 2009 

o simplemente, strtotime("+1 month")

Intenté esto como una alondra, y realmente funciona

 strtotime('last day next month') 

Asi que :

 $today_next_month = strtotime('this day next month'); $last_day_next_month = strtotime('last day next month'); if (date('d', $today_next_month) < date('d', $last_day_next_month)){ $date = date('md-Y', $last_day_next_month); } else { $date = date('md-Y', $today_next_month); } echo "And the winner is : $date
";

Sencillo

 public function adicionarMesMantendoDia($date, $months, $format = "Ymd"){ $date = \DateTime::createFromFormat($format, $date); for($i=0;$i < $months; $i++){ $date->modify('+ ' . date("t", $date->getTimestamp()) . ' day'); } return $date; } 

¿Qué tal esta función?

  function getNextMonthN($date, $n = 1) { $newDate = strtotime('+' . $n . ' months', $date); if (date('j', $date) !== (date('j', $newDate))) { $newDate = mktime(0, 0, 0, date('n', $newDate), 0, date('Y', $newDate)); } return $newDate; } 

Hay otra solución en el sitio del manual de php.net en la entrada de Strtotime en los comentarios .

Nadie mencionó esta alternativa, aunque el resultado es el mismo que los demás, y probablemente no lo que el OP está buscando:

 $today = new DateTime(); $today->modify("+1 month"); echo $today->format("dmY"); 

¿Por qué no simplemente almacenar el mes y el día por separado e incrementar el mes por uno, y luego usar la función de fecha de verificación de PHP para validar la fecha, disminuyendo el día uno hasta que la fecha sea válida?

Sé que esta es una publicación anterior, pero se pensó para dar un enfoque diferente.

Por lo tanto, en lugar de intentar calcular los días en un mes (lo que es algo complicado), uno puede averiguar el próximo mes fácilmente usando el mes actual, por ejemplo:

 date("m", strtotime($current."+1 month")); 

A continuación, obtenga el día del mes actual con la date("d") y concaténese con el mes siguiente del código anterior.

También tuve el mismo problema, pero cuando probé las soluciones anteriores no pudieron funcionar perfectamente para mí, probé mi parte y se me ocurrió una nueva solución que es:

 $startDate = date("Ymd"); $month = date("m",strtotime($startDate)); $nextmonth = date("m",strtotime("$startDate +1 month")); if((($nextmonth-$month) > 1) || ($month == 12 && $nextmonth != 1)) { $nextDate = date( 'tmY',strtotime("$startDate +1 week")); }else { $nextDate = date("Ymd",strtotime("$startDate +1 month")); } echo $nextSameDate = date("Y",$nextDate).'-'.date("m",$nextDate).'-'.date("d",$startDate); 

Estilo OOP de fecha y hora

  18-09-2015 $expiry = new DateTime(); for($i=1;$i<5;$i++){ $expiry->modify('+1 Month'); echo $expiry->format('dm-Y'); echo '
'; } ?> //18-10-2015 //18-11-2015 //18-12-2015 //18-01-2016

Esto es lo que uso

Esta es una marca de tiempo de la fecha actual del mes

 $month_timestamp = strtotime(date('Y-m', $create_timestamp)); 

Día actual

 $current_day = date('d'); 

Y esto es el próximo mes el mismo día en formato “Ymd”

 $next_month_first = date('Ym-' . $current_day, strtotime('next month', $month_timestamp)); 

Ninguno de los anteriores se ocupó de días no existentes (30 de febrero o 31 de abril, por ejemplo), así que aquí está mi función:

  $nbDaysInThisMonth) { $day = $nbDaysInThisMonth; } $day = sprintf('%02s', $day); return strtotime("$year-$monthFormatted-$day"); } $time = strtotime("2017-10-31"); for ($i = 0; $i <= 15; $i++) { $_time = getSameDayNextMonth($time, $i); echo date("Ymd", $_time) . '
'; } /** * 2017-10-31 * 2017-11-30 * 2017-12-31 * 2017-01-31 * 2017-02-28 * 2017-03-31 * 2017-04-30 * 2017-05-31 * 2017-06-30 * 2017-07-31 * 2017-08-31 * 2017-09-30 * 2018-10-31 * 2018-11-30 * 2018-12-31 * 2018-01-31 */