web-dev-qa-db-fra.com

Comment puis-je obtenir la date du mois prochain à partir de la date d'aujourd'hui et l'insérer dans ma base de données?

J'ai deux colonnes dans ma base de données: start_date et end_date, qui sont tous deux des types DATE. Mon code met à jour les dates comme suit:

$today_date = date("Y-m-d");
$end_date = date("Y-m-d"); // date +1 month ??

$sql1 = "UPDATE `users` SET `start_date` = '".$today_date."', `end_date` = '".$end_date."'  WHERE `users`.`id` ='".$id."' LIMIT 1 ;";

Quel est le meilleur moyen de rendre $end_date égal à $start_date + un mois? Par exemple, 2000 - 10 - 01 deviendrait 2000 - 11 - 01.

30
Saleh

Vous pouvez utiliser la fonction strtotime () de PHP:

// One month from today
$date = date('Y-m-d', strtotime('+1 month'));

// One month from a specific date
$date = date('Y-m-d', strtotime('+1 month', strtotime('2015-01-01')));

Notez simplement que +1 month n'est pas toujours calculé intuitivement. Il semble toujours ajouter le nombre de jours existant dans le mois en cours.

Current Date  | +1 month
-----------------------------------------------------
2015-01-01    | 2015-02-01   (+31 days)
2015-01-15    | 2015-02-15   (+31 days)
2015-01-30    | 2015-03-02   (+31 days, skips Feb)
2015-01-31    | 2015-03-03   (+31 days, skips Feb)
2015-02-15    | 2015-03-15   (+28 days)
2015-03-31    | 2015-05-01   (+31 days, skips April)
2015-12-31    | 2016-01-31   (+31 days)

Quelques autres intervalles de date/heure que vous pouvez utiliser:

$date = date('Y-m-d'); // Initial date string to use in calculation

$date = date('Y-m-d', strtotime('+1 day', strtotime($date)));
$date = date('Y-m-d', strtotime('+1 week', strtotime($date)));
$date = date('Y-m-d', strtotime('+2 week', strtotime($date)));
$date = date('Y-m-d', strtotime('+1 month', strtotime($date)));
$date = date('Y-m-d', strtotime('+30 days', strtotime($date)));
75
Gazler

La réponse acceptée ne fonctionne que si vous voulez exactement 31 jours plus tard. Cela signifie que si vous utilisez la date "2013-05-31", vous vous attendez à ne pas être en juin, ce qui n'est pas ce que je voulais.

Si vous voulez avoir le mois prochain, je vous suggère d'utiliser l'année et le mois en cours, mais continuez d'utiliser le 1er.

$date = date("Y-m-01");
$newdate = strtotime ( '+1 month' , strtotime ( $date ) ) ;

De cette façon, vous pourrez obtenir le mois et l'année du mois suivant sans avoir à passer un mois.

18

Vous n’avez pas réellement besoin des fonctions PHP pour y parvenir. Vous pouvez déjà faire des manipulations simples de date directement en SQL, par exemple:

$sql1 = "
    UPDATE `users` SET 
    `start_date` = CURDATE(), 
    `end_date` = DATE_ADD(CURDATE(), INTERVAL 1 MONTH)  
    WHERE `users`.`id` = '" . $id . "';
";

Reportez-vous à http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_addtime

17
Anton S

Soyez prudent, car parfois strtotime("+1 months") peut ignorer les numéros de mois.

Exemple:

$today = date("Y-m-d"); // 2012-01-30
$next_month = date("Y-m-d", strtotime("$today +1 month"));

Si nous sommes aujourd'hui en janvier, le mois prochain devrait être en février et compter 28 ou 29 jours, mais PHP renverra mars comme le mois prochain, pas en février.

13
Lauris Kuznecovs

Si vous souhaitez une date spécifique le mois prochain, vous pouvez le faire:

// Calculate the timestamp
$expire = strtotime('first day of +1 month');

// Format the timestamp as a string
echo date('m/d/Y', $expire);

Notez que cela fonctionne réellement de manière plus fiable lorsque +1 month peut être source de confusion. Par exemple...

Current Day   | first day of +1 month     | +1 month
---------------------------------------------------------------------------
2015-01-01    | 2015-02-01                | 2015-02-01
2015-01-30    | 2015-02-01                | 2015-03-02  (skips Feb)
2015-01-31    | 2015-02-01                | 2015-03-03  (skips Feb)
2015-03-31    | 2015-04-01                | 2015-05-01  (skips April)
2015-12-31    | 2016-01-01                | 2016-01-31
13
Gil Prata

Vous pouvez utiliser strtotime () comme dans l'exemple de Gazler, ce qui est bien dans ce cas.

Si vous avez besoin d’un contrôle plus compliqué, utilisez mktime () .

$end_date = mktime(date("H"), date("i"), date("s"), date("n") + 1, date("j"), date("Y"));
1
Orbling

Ajout de ma solution ici, car c'est le fil qui vient dans la recherche Google. Ceci permet d’obtenir la prochaine date du mois, en corrigeant les sauts, en conservant la prochaine date le mois prochain. 

PHP ajoute le nombre total de jours du mois en cours à la date du jour, si vous utilisez +1 month par exemple. 

Donc, appliquer +1 month à 30-01-2016 renverra 02-03-2016. (Ajout de 31 jours)

Pour mon cas, je devais obtenir 28-02-2016, afin de le conserver le mois prochain. Dans ce cas, vous pouvez utiliser la solution ci-dessous.

Ce code identifiera si le jour donné est supérieur au nombre total de jours du mois prochain. Si tel est le cas, il soustraira intelligemment les jours et renverra la date dans la plage de mois.

Notez que la valeur de retour est au format timestamp.

function getExactDateAfterMonths($timestamp, $months){
    $day_current_date            = date('d', $timestamp);
    $first_date_of_current_month = date('01-m-Y', $timestamp);
    // 't' gives last day of month, which is equal to no of days
    $days_in_next_month          = date('t',  strtotime("+".$months." months", strtotime($first_date_of_current_month)));

    $days_to_substract = 0;
    if($day_current_date > $days_in_next_month)
         $days_to_substract = $day_current_date - $days_in_next_month;

    $php_date_after_months   = strtotime("+".$months." months", $timestamp);
    $exact_date_after_months = strtotime("-".$days_to_substract." days", $php_date_after_months);

    return $exact_date_after_months;
}

getExactDateAfterMonths(strtotime('30-01-2016'), 1);
// $php_date_after_months   => 02-03-2016
// $exact_date_after_months => 28-02-2016
1
Shah Abaz Khan

Cette fonction renvoie tout nombre de mois correct de manière positive ou négative. Trouvé dans la section commentaire ici :

function addMonthsToTime($numMonths = 1, $timeStamp = null){
    $timeStamp === null and $timeStamp = time();//Default to the present
    $newMonthNumDays =  date('d',strtotime('last day of '.$numMonths.' months', $timeStamp));//Number of days in the new month
    $currentDayOfMonth = date('d',$timeStamp);

    if($currentDayOfMonth > $newMonthNumDays){
      $newTimeStamp = strtotime('-'.($currentDayOfMonth - $newMonthNumDays).' days '.$numMonths.' months', $timeStamp);
    } else {
    $newTimeStamp = strtotime($numMonths.' months', $timeStamp);
    }

    return $newTimeStamp;
}
0
kouton

1er février 2014 

$date = mktime( 0, 0, 0, 2, 1, 2014 );

echo strftime( '%d %B %Y', strtotime( '+1 month', $date ) );
0
punitha subramani v
date("Y-m-d",strtotime("last day of +1 month",strtotime($anydate)))
0
leon

Je pense que cela ressemble à la réponse de Kouton, mais celle-ci prend simplement un horodatage et renvoie un horodatage QUELQUE CHOSE le mois prochain. Vous pouvez utiliser date ("m", $ nextMonthDateN) à partir de là. 

function nextMonthTimeStamp($curDateN){ 
   $nextMonthDateN = $curDateN;
   while( date("m", $nextMonthDateN) == date("m", $curDateN) ){
      $nextMonthDateN += 60*60*24*27;
   }
   return $nextMonthDateN; //or return date("m", $nextMonthDateN);
}
0
rikkitikkitumbo