fecha de incremento en un mes

103

Digamos que tengo una fecha en el siguiente formato: 2010-12-11 (año-lunes-día)

Con PHP, quiero incrementar la fecha en un mes, y quiero que el año se incremente automáticamente, si es necesario (es decir, incrementando de diciembre de 2012 a enero de 2013).

Saludos.

tarique
fuente

Respuestas:

167
$time = strtotime("2010.12.11");
$final = date("Y-m-d", strtotime("+1 month", $time));

// Finally you will have the date you're looking for.
Raphael Caixeta
fuente
31
No funciona con todas las fechas. Por ejemplo, 2013-05-31 mostrará julio en lugar del mes siguiente, que es junio.
Patrick Desjardins
1
Estoy recibiendo seguimiento, 2014-03-03 por la razón 2014-01-31?
Manish Goyal
No funcionó con esta cadena: "2014-06-19 15:00:19"
Meetai.com
1
Esto se rompe a veces. La respuesta de @jason es técnicamente más correcta ya que tiene en cuenta cosas como años bisiestos, duraciones de meses, etc. Eso debe marcarse como la respuesta correcta.
Skift
4
esta respuesta es peligrosa porque falla en escenarios del "último día del mes" que es difícil de detectar.
ckonig
43

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
Jason
fuente
3
Excelente, justo lo que necesitaba. ¡Gracias por ahorrarme tanto tiempo!
Martes
No hay problema, me alegro de que lo hayas encontrado útil
Jason
Gracias Jason, esto fue muy útil. Lo reformateé y agregué más comentarios para ayudarme a entenderlo todo. En caso de que eso ayude a alguien, lo he publicado más abajo (intenté agregarlo aquí pero era demasiado largo).
Greg
1
Sin embargo, da el mismo valor para el 30 de enero y el 31 de enero.
Sábado
Funciona como un encanto, solo lo probé del 1 de enero al 31 de diciembre de 2020, ¡gracias!
Paul Nowak
34

Utilice DateTime::add.

$start = new DateTime("2010-12-11", new DateTimeZone("UTC"));
$month_later = clone $start;
$month_later->add(new DateInterval("P1M"));

Usé clon porque add modifica el objeto original, lo que podría no ser deseado.

Matthew Flaschen
fuente
1
no funciona ... (new DateTime ("2010-01-31", new DateTimeZone ("UTC"))) -> agregar (new DateInterval ("P1M")) -> formato ('Ym-d') da como resultado 2010-03-03
Scholtz
13
strtotime( "+1 month", strtotime( $time ) );

esto devuelve una marca de tiempo que se puede usar con la función de fecha

Galeno
fuente
@Gelen: esto no funciona, da una fecha incorrecta ... por favor diga cómo usar su método, ¿cuál es el valor de $ time aquí?
sqlchild
esto no funciona, da una fecha incorrecta ... por favor diga cómo usar su método, ¿cuál es el valor de $ time aquí?
sqlchild
Mismo problema que la respuesta aceptada. No funciona en todas las cadenas.
Meetai.com
esto funciona para mí (por supuesto, $timetiene un valor inicial).
tatskie
6
(date('d') > 28) ? date("mdY", strtotime("last day of next month")) : date("mdY", strtotime("+1 month"));

Esto compensará febrero y los otros meses de 31 días. Por supuesto, podría hacer muchas más comprobaciones para obtener más exactos para los formatos de fecha relativa de 'este día el próximo mes' (que lamentablemente no funciona, vea a continuación), y también podría usar DateTime.

Ambos DateInterval('P1M')y strtotime("+1 month")esencialmente están agregando ciegamente 31 días independientemente del número de días del mes siguiente.

  • 2010-01-31 => 3 de marzo
  • 2012-01-31 => 2 de marzo (año bisiesto)
Wayne Weibel
fuente
3
"sumando ciegamente 31 días sin importar el número de días del mes siguiente", ¡absolutamente cierto! (+1).
Jose Manuel Abarca Rodríguez
5

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;
//******************************************************************//
vineet
fuente
1
funciona para mí gracias. Pero, date ('m', strtotime ("+ 1 mes", strtotime ($ occDate))) y date ('m', strtotime ("+ 1 mes", $ occDate)) funcionan igual.
1
No, ambas son diferencias @ sah.cyBuzzSc. Considere el ejemplo: - $ occDate = '2014-12-28'; $ forOdNextMonth = date ('m', strtotime ("+ 1 mes", $ occDate)); El valor $ forOdNextMonth es 02.
vineet
gracias por explicar @chotesah. Tu segundo ejemplo es bastante bueno.
3

Primero configure su 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 incrementa el año, la fecha

strtotime("12-12-2012 +1 Year");

Ans es 12-12-2013

Pravin Suthar
fuente
1

Gracias Jason, tu publicación fue muy útil. Lo reformateé 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
Greg
fuente
1
$date = strtotime("2017-12-11");
$newDate = date("Y-m-d", strtotime("+1 month", $date));

Si quieres incrementar por días también puedes hacerlo

$date = strtotime("2017-12-11");
$newDate = date("Y-m-d", strtotime("+5 day", $date));
Kapil Kumar
fuente
1

Simplemente actualice la respuesta con un método simple para encontrar la fecha después del número de meses. Como la mejor respuesta marcada no da la solución correcta.

<?php

    $date = date('2020-05-31');
    $current = date("m",strtotime($date));
    $next = date("m",strtotime($date."+1 month"));
    if($current==$next-1){
        $needed = date('Y-m-d',strtotime($date." +1 month"));
    }else{
        $needed = date('Y-m-d', strtotime("last day of next month",strtotime($date)));
    }
    echo "Date after 1 month from 2020-05-31 would be : $needed";

?>
Ashokkumar C
fuente
Solo Esta es la solución correcta para la fecha de +1 mes.
aplicación asad
0
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"
T30
fuente
0

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');

Simplemente cambie el formato de fecha.

Fabricio
fuente
-2

ponga una fecha en el cuadro de entrada y luego haga clic en el botón obtener el día desde 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()]);

    });  
             });
user9401222
fuente
-2
 <?php
              $selectdata ="select fromd,tod  from register where username='$username'";
            $q=mysqli_query($conm,$selectdata);
            $row=mysqli_fetch_array($q);

            $startdate=$row['fromd']; 
            $stdate=date('Y', strtotime($startdate));  

            $endate=$row['tod']; 
            $enddate=date('Y', strtotime($endate));  

            $years = range ($stdate,$enddate);
            echo '<select name="years" class="form-control">';
            echo '<option>SELECT</option>';
            foreach($years as $year)
              {   echo '<option value="'.$year.'"> '.$year.' </option>';  }
                echo '</select>'; ?>
Sasi Kumar S
fuente
2
Copiar y pegar código no siempre ayuda. También deberías explicar un poco el código.
mrkernelpanic
-2

Todas las soluciones presentadas no funcionan correctamente.
strtotime () y DateTime :: add o DateTime :: modified dan en algún momento resultados no válidos.
Ejemplos:
- 31.08.2019 + 1 mes da 01.10.2019 en lugar de 30.09.2019
- 29.02.2020 + 1 año da 01.03.2021 en lugar de 28.02.2021
(probado en PHP 5.5, PHP 7.3)

A continuación se muestra mi función basada en la idea publicada por Angelo que resuelve el problema:

// $time - unix time or date in any format accepted by strtotime() e.g. 2020-02-29  
// $days, $months, $years - values to add
// returns new date in format 2021-02-28
function addTime($time, $days, $months, $years)
{
    // Convert unix time to date format
    if (is_numeric($time))
    $time = date('Y-m-d', $time);

    try
    {
        $date_time = new DateTime($time);
    }
    catch (Exception $e)
    {
        echo $e->getMessage();
        exit;
    }

    if ($days)
    $date_time->add(new DateInterval('P'.$days.'D'));

    // Preserve day number
    if ($months or $years)
    $old_day = $date_time->format('d');

    if ($months)
    $date_time->add(new DateInterval('P'.$months.'M'));

    if ($years)
    $date_time->add(new DateInterval('P'.$years.'Y'));

    // Patch for adding months or years    
    if ($months or $years)
    {
        $new_day = $date_time->format("d");

        // The day is changed - set the last day of the previous month
        if ($old_day != $new_day)
        $date_time->sub(new DateInterval('P'.$new_day.'D'));
    }
    // You can chage returned format here
    return $date_time->format('Y-m-d');
}

Ejemplos de uso:

echo addTime('2020-02-29', 0, 0, 1); // add 1 year (result: 2021-02-28)
echo addTime('2019-08-31', 0, 1, 0); // add 1 month (result: 2019-09-30)
echo addTime('2019-03-15', 12, 2, 1); // add 12 days, 2 months, 1 year (result: 2019-09-30)
Wojtek Suszycki
fuente