it-swarm.com.de

Wie bekomme ich das Datum des nächsten Monats vom heutigen Datum und füge es in meine Datenbank ein?

Ich habe zwei Spalten in meiner Datenbank: start_date und end_date, die beide DATE-Typen sind. Mein Code aktualisiert die Daten wie folgt:

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

Was ist der beste Weg, $end_date gleich $start_date + einen Monat zu machen? Beispielsweise würde 2000 - 10 - 01 zu 2000 - 11 - 01 werden.

30
Saleh

Sie können die Funktion strtotime () von PHP verwenden:

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

Beachten Sie, dass +1 month nicht immer intuitiv berechnet wird. Es scheint, dass immer die Anzahl der Tage hinzugefügt wird, die im aktuellen Monat vorhanden sind.

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)

Einige andere Datums-/Zeitintervalle, die Sie verwenden können:

$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

Die akzeptierte Antwort funktioniert nur, wenn Sie genau 31 Tage später wünschen. Das bedeutet, wenn Sie das Datum "2013-05-31" verwenden, von dem Sie erwarten, dass es nicht im Juni ist, was ich nicht wollte.

Wenn Sie den nächsten Monat haben möchten, empfehle ich Ihnen, das aktuelle Jahr und den aktuellen Monat zu verwenden.

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

Auf diese Weise können Sie den Monat und das Jahr des nächsten Monats abrufen, ohne dass ein Monat übersprungen wird.

18

Um dies zu erreichen, benötigen Sie keine PHP - Funktionen. Sie können bereits einfache Datumsänderungen direkt in SQL vornehmen, zum Beispiel:

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

Siehe http://dev.mysql.com/doc/refman/5.1/de/date-and-time-functions.html#function_addtime

17
Anton S

Seien Sie vorsichtig, denn manchmal kann strtotime("+1 months") Monatszahlen überspringen.

Beispiel:

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

Wenn heute Januar ist, sollte der nächste Monat Februar sein, der 28 oder 29 Tage hat, aber PHP kehrt als nächsten Monat März zurück, nicht Februar.

13

Wenn Sie im nächsten Monat ein bestimmtes Datum wünschen, können Sie Folgendes tun:

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

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

Beachten Sie, dass dies tatsächlich zuverlässiger ist, wenn +1 month verwirrend sein kann. Zum Beispiel...

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

Sie können strtotime () wie in Gazlers Beispiel verwenden, was für diesen Fall großartig ist.

Wenn Sie eine kompliziertere Steuerung benötigen, verwenden Sie mktime () .

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

Meine Lösung hier hinzufügen, da dies der Thread ist, der bei der Google-Suche verwendet wird. Hiermit wird das nächste Datum des Monats ermittelt, eventuelle Sprünge korrigiert und das nächste Datum im nächsten Monat beibehalten. 

PHP fügt die Gesamtzahl der Tage des aktuellen Monats zum aktuellen Datum hinzu, wenn Sie beispielsweise +1 month verwenden. 

Wenn Sie +1 month auf 30-01-2016 anwenden, wird 02-03-2016 zurückgegeben. (Hinzufügen von 31 Tagen)

Für meinen Fall musste ich 28-02-2016 bekommen, um ihn im nächsten Monat zu behalten. In solchen Fällen können Sie die Lösung unten verwenden.

Dieser Code gibt an, ob der Tag des angegebenen Datums die Gesamttage des nächsten Monats überschreitet. Wenn ja, werden die Tage geschickt abgezogen und das Datum innerhalb des Monatsbereichs zurückgegeben.

Beachten Sie, dass der Rückgabewert im Zeitstempelformat vorliegt.

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

Ich weiß - irgendwie spät. Aber ich habe am selben Problem gearbeitet. Wenn ein Kunde einen Servicemonat kauft, rechnet er damit, ihn einen Monat später zu beenden. So habe ich es gelöst:

    $now = time(); 
    $day = date('j',$now);
    $year = date('o',$now);
    $month = date('n',$now);
    $hour = date('G');
    $minute = date('i');
    $month += $count;
    if ($month > 12)        {
            $month -= 12;
            $year++; 
            }
    $work = strtotime($year . "-" . $month . "-01");
    $avail = date('t',$work);
    if ($day > $avail)
            $day = $avail;
    $stamp = strtotime($year . "-" . $month . "-" . $day . " " . $hour . ":" . $minute);

Dies berechnet den genauen Tag und zählt die nächsten Monate (wobei count <= 12). Wenn der Dienst am 31. März 2019 gestartet wurde und 11 Monate lang ausgeführt wird, endet er am 29. Februar 2020. Wenn er nur einen Monat lang ausgeführt wird, ist das Enddatum der 30. April 2019.

0
Michaela.Merz

Diese Funktion gibt eine beliebige Anzahl von korrekten Monaten positiv oder negativ zurück. Gefunden im Kommentar hier :

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

01. Feb. 2014 

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

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

Ich denke, dass dies der Antwort von Kouton ähnlich ist, aber dieser nimmt nur einen Zeitstempel auf und gibt im nächsten Monat einen Zeitstempel zurück. Von dort könnten Sie date ("m", $ nextMonthDateN) verwenden. 

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