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.
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)));
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.
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
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.
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
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"));
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
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.
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;
}
01. Feb. 2014
$date = mktime( 0, 0, 0, 2, 1, 2014 );
echo strftime( '%d %B %Y', strtotime( '+1 month', $date ) );
date("Y-m-d",strtotime("last day of +1 month",strtotime($anydate)))
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);
}