120 votes

incrémenter la date d'un mois

Disons que j'ai une date au format suivant : 2010-12-11 (année-mois-jour)

Avec PHP, je veux incrémenter la date d'un mois, et je veux que l'année soit automatiquement incrémentée, si nécessaire (c'est-à-dire incrémenter de décembre 2012 à janvier 2013).

Regards.

6voto

Wayne Weibel Points 263
(date('d') > 28) ? date("mdY", strtotime("last day of next month")) : date("mdY", strtotime("+1 month"));

Cela permettra de compenser le mois de février et les autres mois de 31 jours. Vous pouvez bien sûr faire beaucoup plus de vérifications pour obtenir des résultats plus précis pour "ce jour du mois prochain". formats de date relatifs (qui ne fonctionne malheureusement pas, voir ci-dessous), et vous pourriez tout aussi bien utiliser DateTime.

Les deux sites DateInterval('P1M') y strtotime("+1 month") ajoutent aveuglément 31 jours sans tenir compte du nombre de jours du mois suivant.

  • 2010-01-31 => 3 mars
  • 2012-01-31 => 2 mars (année bissextile)

6voto

Pravin Suthar Points 899

Veuillez d'abord définir votre format de date comme 12-12-2012.

Après avoir utilisé cette fonction, elle fonctionne correctement ;

$date =  date('d-m-Y',strtotime("12-12-2012 +2 Months");

Ici 12-12-2012 est votre date et +2 Mois est l'incrément du mois ;

Vous incrémentez également l'année, la date

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

La réponse est 12-12-2013

5voto

chotesah Points 11

J'utilise cette méthode :-

 $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;
//******************************************************************//

4voto

Ashok Points 636

Mise à jour de la réponse avec une méthode simple pour trouver la date après un certain nombre de mois. Comme la meilleure réponse marquée ne donne pas la solution correcte.

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

?>

1voto

Greg Points 581

Merci Jason, votre message a été très utile. Je l'ai reformaté et ajouté plus de commentaires pour m'aider à comprendre tout cela. Au cas où cela aiderait quelqu'un, je l'ai posté ici :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X