Inkrementierungsdatum um einen Monat


103

Angenommen, ich habe ein Datum im folgenden Format: 2010-12-11 (Jahr-Montag)

Mit PHP möchte ich das Datum um einen Monat erhöhen und das Jahr bei Bedarf automatisch erhöhen (dh von Dezember 2012 bis Januar 2013 erhöhen).

Grüße.

Antworten:


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

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

31
Es funktioniert nicht mit allen Daten. Zum Beispiel wird 2013-05-31 Juli anstelle des nächsten Monats, der Juni ist, anzeigen.
Patrick Desjardins

1
Ich werde folgen, 2014-03-03 aus 2014-01-31 Grund?
Manish Goyal

Mit dieser Zeichenfolge hat es nicht funktioniert: "2014-06-19 15:00:19"
Meetai.com

1
Das bricht manchmal. Die Antwort von @jason ist technisch korrekter, da sie Dinge wie Schaltjahre, Monatslängen usw. berücksichtigt. Das sollte als die richtige Antwort markiert werden.
Skift

4
Diese Antwort ist gefährlich, da sie an Szenarien mit dem "letzten Tag des Monats" fehlschlägt, die schwer zu erkennen sind.
König

43

Ich brauchte ähnliche Funktionen, bis auf einen monatlichen Zyklus (plus Monate, minus 1 Tag). Nachdem ich eine Weile nach SO gesucht hatte, konnte ich diese Plug-n-Play-Lösung entwickeln:

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;
    }

Beispiel:

$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

3
Ausgezeichnet, genau das, was ich brauchte. Danke, dass du mir viel Zeit gespart hast!
Tum

Kein Problem, ich bin froh, dass Sie es nützlich fanden
Jason

Danke Jason, das war sehr hilfreich. Ich habe es neu formatiert und weitere Kommentare hinzugefügt, um alles besser zu verstehen. Falls das jemandem hilft, habe ich es weiter unten gepostet (habe versucht, es hier hinzuzufügen, aber es war zu lang).
Greg

1
es gibt den gleichen Wert für 30 Jan und 31 Jan!
Satys

Funktioniert wie ein Zauber, hat es gerade für 2020 vom 1. Januar bis 31. Dezember getestet, danke!
Paul Nowak

34

Verwenden Sie DateTime::add.

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

Ich habe Klon verwendet, weil add das ursprüngliche Objekt ändert, was möglicherweise nicht erwünscht ist.


1
funktioniert nicht .. (neue DateTime ("2010-01-31", neue DateTimeZone ("UTC"))) -> add (neues DateInterval ("P1M")) -> Format ('Ym-d') ergibt 03.03.2010
Scholtz

13
strtotime( "+1 month", strtotime( $time ) );

Dies gibt einen Zeitstempel zurück, der mit der Datumsfunktion verwendet werden kann


@Gelen: das funktioniert nicht, gibt falsches Datum an .... bitte sagen Sie, wie Sie Ihre Methode verwenden, was ist der Wert von $ time hier?
sqlchild

Dies funktioniert nicht, gibt ein falsches Datum an. Bitte geben Sie an, wie Sie Ihre Methode verwenden sollen. Was ist der Wert von $ time hier?
sqlchild

Gleiches Problem wie akzeptierte Antwort. Funktioniert nicht bei allen Saiten.
Meetai.com

Das funktioniert bei mir (hat natürlich $timeeinen Anfangswert).
Tatskie

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

Dies wird den Februar und die anderen 31-Tage-Monate kompensieren. Sie könnten natürlich viel mehr nachsehen, um die relativen Datumsformate für "diesen Tag im nächsten Monat" genauer zu bestimmen (was leider nicht funktioniert, siehe unten), und Sie könnten genauso gut DateTime verwenden.

Beide DateInterval('P1M')und strtotime("+1 month")addieren im Wesentlichen blind 31 Tage, unabhängig von der Anzahl der Tage im folgenden Monat.

  • 2010-01-31 => 3. März
  • 2012-01-31 => 2. März (Schaltjahr)

3
"31 Tage blind hinzufügen, unabhängig von der Anzahl der Tage im folgenden Monat", absolut richtig! (+1).
Jose Manuel Abarca Rodríguez


5

Ich benutze diesen Weg: -

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

1
es funktioniert für mich danke. Datum ('m', Zeit ("+ 1 Monat", Zeit ($ occDate))) und Datum ('m', Zeit ("+ 1 Monat", $ occDate)) funktionieren jedoch gleich.

1
Nein, beides ist der Unterschied @ sah.cyBuzzSc. Betrachten Sie das Beispiel: - $ occDate = '2014-12-28'; $ forOdNextMonth = Datum ('m', strtotime ("+ 1 Monat", $ occDate)); Der Wert $ forOdNextMonth ist 02.
Vineet

Danke, dass du @chotesah erklärt hast. Ihr zweites Beispiel ist ziemlich gut.

3

Bitte stellen Sie zuerst Ihr Datumsformat wie 12-12-2012 ein

Nach Verwendung dieser Funktion funktioniert es ordnungsgemäß.

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

Hier ist der 12-12-2012 Ihr Datum und +2 Monate ist das Inkrement des Monats.

Sie erhöhen auch das Jahr und das Datum

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

Ans ist 12-12-2013


1

Danke Jason, dein Beitrag war sehr hilfreich. Ich habe es neu formatiert und weitere Kommentare hinzugefügt, um alles besser zu verstehen. Falls das jemandem hilft, habe ich es hier gepostet:

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

1
$date = strtotime("2017-12-11");
$newDate = date("Y-m-d", strtotime("+1 month", $date));

Wenn Sie um Tage erhöhen möchten, können Sie dies auch tun

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

1

Aktualisieren Sie einfach die Antwort mit einer einfachen Methode, um das Datum nach einer Anzahl von Monaten zu finden. Da die beste markierte Antwort nicht die richtige Lösung ergibt.

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

?>

Nur Dies ist die richtige Lösung für ein Datum von +1 Monaten.
Asad App

0
function dayOfWeek($date){
    return DateTime::createFromFormat('Y-m-d', $date)->format('N');
}

Anwendungsbeispiele:

echo dayOfWeek(2016-12-22);
// "4"
echo dayOfWeek(date('Y-m-d'));
// "4"

0

Für alle, die eine Antwort auf ein beliebiges Datumsformat suchen.

echo date_create_from_format('d/m/Y', '15/04/2017')->add(new DateInterval('P1M'))->format('d/m/Y');

Ändern Sie einfach das Datumsformat.


-2

Geben Sie ein Datum in das Eingabefeld ein und klicken Sie in jquery auf die Schaltfläche Tag vom Datum abrufen

$(document).ready( function() {
    $("button").click(function(){   
    var day = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
    var a = new Date();
    $(".result").text(day[a.getDay()]);

    });  
             });

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

2
Das Kopieren von Einfügecode hilft nicht immer. Sie sollten den Code auch ein wenig erklären.
Mrkernelpanic

-2

Alle vorgestellten Lösungen funktionieren nicht richtig.
strtotime () und DateTime :: add oder DateTime :: modify führen manchmal zu ungültigen Ergebnissen.
Beispiele:
- 31.08.2019 + 1 Monat ergibt 01.10.2019 statt 30.09.2019
- 29.02.2020 + 1 Jahr ergibt 01.03.2021 statt 28.02.2021
(getestet auf PHP 5.5, PHP 7.3)

Unten ist meine Funktion basierend auf einer Idee von Angelo , die das Problem löst:

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

Anwendungsbeispiele:

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.