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.

197voto

Raphael Caixeta Points 3490
$time = strtotime("2010.12.11");
$final = date("Y-m-d", strtotime("+1 month", $time));

// Finally you will have the date you're looking for.

49voto

Jason Points 31

J'avais besoin d'une fonctionnalité similaire, mais pour un cycle mensuel (plus les mois, moins un jour). Après avoir cherché dans S.O. pendant un certain temps, j'ai pu élaborer cette solution 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;
    }

Exemple :

$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

37voto

Matthew Flaschen Points 131723

Utilice DateTime::add .

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

J'ai utilisé clone car add modifie l'objet original, ce qui peut ne pas être souhaité.

14voto

Galen Points 20535
strtotime( "+1 month", strtotime( $time ) );

ceci renvoie un horodatage qui peut être utilisé avec la fonction date

8voto

HRoux Points 314

Vous pouvez utiliser DateTime::modify comme ceci :

$date = new DateTime('2010-12-11');
$date->modify('+1 month');

Voir les documentations :

https://php.net/manual/en/datetime.modify.php

https://php.net/manual/en/class.datetime.php


MISE À JOUR janvier 2021 : correction des erreurs soulevées par les commentaires

Cette solution pose quelques problèmes pour les mois à 31 jours comme le mois de mai, etc.

Exemple : ce saut va du 31 mai au 1er juillet, ce qui est incorrect.

Pour corriger cela, vous pouvez créer cette fonction personnalisée

function addMonths($date,$months){

    $init=clone $date;
    $modifier=$months.' months';
    $back_modifier =-$months.' months';

    $date->modify($modifier);
    $back_to_init= clone $date;
    $back_to_init->modify($back_modifier);

    while($init->format('m')!=$back_to_init->format('m')){
        $date->modify('-1 day')    ;
        $back_to_init= clone $date;
        $back_to_init->modify($back_modifier);   
    }
}

Alors vous pouvez l'utiliser comme ça :

$date = new DateTime('2010-05-31');
addMonths($date, 1);
print_r($date);
//DateTime Object ( [date] => 2010-06-30 00:00:00.000000 [timezone_type] => 3 [timezone] => Europe/Berlin ) 

Cette solution a été trouvée sur PHP.net par jenspj : https://www.php.net/manual/fr/datetime.modify.php#107592

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