Hinzufügen eines Tages zu einem Datum


171

Mein Code zum Hinzufügen eines Tages zu einem Datum gibt ein Datum vor dem Hinzufügen des Tages zurück: 2009-09-30 20:24:00Datum nach dem Hinzufügen eines Tages SOLLTE auf den nächsten Monat übertragen werden:1970-01-01 17:33:29

<?php

    //add day to date test for month roll over

    $stop_date = date('Y-m-d H:i:s', strtotime("2009-09-30 20:24:00"));

    echo 'date before day adding: '.$stop_date; 

    $stop_date = date('Y-m-d H:i:s', strtotime('+1 day', $stop_date));

    echo ' date after adding one day. SHOULD be rolled over to the next month: '.$stop_date;
?>

Ich habe schon ziemlich ähnlichen Code verwendet. Was mache ich hier falsch?

Antworten:


332
<?php
$stop_date = '2009-09-30 20:24:00';
echo 'date before day adding: ' . $stop_date; 
$stop_date = date('Y-m-d H:i:s', strtotime($stop_date . ' +1 day'));
echo 'date after adding 1 day: ' . $stop_date;
?>

Für PHP 5.2.0+ können Sie auch Folgendes tun:

$stop_date = new DateTime('2009-09-30 20:24:00');
echo 'date before day adding: ' . $stop_date->format('Y-m-d H:i:s'); 
$stop_date->modify('+1 day');
echo 'date after adding 1 day: ' . $stop_date->format('Y-m-d H:i:s');

3
Vielen Dank. Es wurde gelöst als: $ stop_date = date ('Ymd H: i: s', strtotime ("$ stop_date + 1 Tag"));
ian

11
Sie sollten keine Variable in einer Zeichenfolge verwenden. Sie sollten verwenden: date('Y-m-d H:i:s', strtotime($stop_date . ' + 1 day'));wie in der Antwort, die @ w35l3y Ihnen gegeben hat.
Cas Bloem

Sie sollten die Funktion date_default_timezone_set aufrufen, bevor Sie diesen Code ausführen. Fügen Sie beispielsweise date_default_timezone_set ('Europe / Rome') hinzu.
Luca Mastrostefano

96
$date = new DateTime('2000-12-31');

$date->modify('+1 day');
echo $date->format('Y-m-d') . "\n";

6
Dies ist eine neuere -perfekte- Lösung.
Cas Bloem

... solange es keine schwerwiegenden Fehler verursacht, wenn es auf Ihrem Host ausgeführt wird;)
Henrik Erlandsson

Entschuldige dich nicht. Einige Leute haben die Antwort der Dame 3 Jahre nach Ihnen gepostet
Mawg sagt, Monica

1
Sie sollten die Funktion date_default_timezone_set aufrufen, bevor Sie diesen Code ausführen. Fügen Sie beispielsweise date_default_timezone_set ('Europe / Rome') hinzu.
Luca Mastrostefano

@ LucaMastrostefano nein, Sie sollten die Zeitzone auf Ihrem Server eingestellt haben ...
MH

28

Einfachste Lösung:

$date = new DateTime('+1 day');
echo $date->format('Y-m-d H:i:s');

Ich mag deinen Weg in einem Einzeilerecho (new DateTime('+1 day'))->format('Y-m-d H:i:s');
Aba

@Aba Ich glaube nicht, dass Ihr One Liner in älteren Versionen von PHP funktioniert, weil ich es ausprobiert habe und eine Fehlermeldung erhalten habe:Unexpected T_OBJECT_OPERATOR” error in PHP
Zachary Weixelbaum

25

Es hat bei mir funktioniert: Zum aktuellen Datum

$date = date('Y-m-d', strtotime("+1 day"));

für jedes Datum:

date('Y-m-d', strtotime("+1 day", strtotime($date)));

2
Danke, es hat bei mir funktioniert. Einfachste aller gegebenen Lösungen.
Puneet Verma

2
Sie müssen nicht wiederholen und verschachteln strtotime()- es kann alles in einem Anruf date('Y-m-d', strtotime($date . " +1 day"));
erledigen

2
Schön, das ist die einfachste Lösung! Vielen Dank
Angel

7

Versuche dies

echo date('Y-m-d H:i:s',date(strtotime("+1 day", strtotime("2009-09-30 20:24:00"))));

Danke Kumpel. Es hat mir geholfen.
Vandolph Reyes

6

Einfach zu lesen und zu verstehen:

$original_date = "2009-09-29";

$time_original = strtotime($original_date);
$time_add      = $time_original + (3600*24); //add seconds of one day

$new_date      = date("Y-m-d", $time_add);

echo $new_date;

3
Dies schlägt manchmal bei Änderungen der Sommerzeit fehl, wenn die Tageslänge nicht 24 Stunden beträgt.
Nik Dow

3

Ich füge immer nur 86400 hinzu (Sekunden an einem Tag):

$stop_date = date('Y-m-d H:i:s', strtotime("2009-09-30 20:24:00") + 86400);

echo 'date after adding 1 day: '.$stop_date; 

Es ist nicht die schickste Art, wie Sie es wahrscheinlich tun könnten, aber es funktioniert!


Wie gehen Sie mit Schaltsekunden um, wenn das Hinzufügen von 86400 nicht funktioniert, da an diesem Tag 86401 Sekunden vorhanden sind? (ok, ich weiß, dass es nur alle paar Jahre passiert, aber je nach App kann dies wichtig sein)
Glen

1
Nicht alle Tage haben 86400 Sekunden. Tatsächlich gibt es an den meisten Orten in den USA zweimal im Jahr 3600 Sekunden weniger oder zusätzliche Sekunden.
Peter Kovacs

1
Sie können Schaltsekunden sicher ignorieren, da dies bei "Unix-Zeit" der Fall ist. Dies ist etwas kompliziert, aber lesen Sie diesen Artikel für weitere Informationen: derickrethans.nl/leap_seconds_and_what_to_do_with_them.php
Christian Davén

2
Sie sollten diese Lösung vermeiden. Hier ist der Grund: stackoverflow.com/questions/2613338/…
mspir

1
Fügen Sie kein Datum hinzu, indem Sie dem vorherigen Tag 86400 Sekunden hinzufügen! Sie werden einen Fehler in Ihrem Code haben! Dies funktioniert nicht an Sommerzeittagen!
Sbrbot

1

Obwohl ich der Antwort von Doug Hays zustimme, werde ich hier sagen, dass der Grund dafür, dass Ihr Code nicht funktioniert, darin besteht, dass strtotime () eine INT als zweites Argument erwartet, keine Zeichenfolge (auch keine, die ein Datum darstellt).

Wenn Sie die maximale Fehlerberichterstattung aktivieren, wird dies als Fehler "Ein nicht gut ausgebildeter numerischer Wert" angezeigt, der die Stufe E_NOTICE hat.


1

Die modify()Methode, mit der einem vorhandenen DateTimeWert Inkremente hinzugefügt werden können.

Erstellen Sie ein neues DateTimeObjekt mit dem aktuellen Datum und der aktuellen Uhrzeit:

$due_dt = new DateTime();

Sobald Sie das DateTimeObjekt haben, können Sie seinen Wert bearbeiten, indem Sie Zeiträume hinzufügen oder entfernen:

$due_dt->modify('+1 day');

Sie können mehr im PHP-Handbuch lesen .


0

Der folgende Code ruft den ersten Tag im Januar des laufenden Jahres ab (es kann sich jedoch auch um ein anderes Datum handeln) und fügt diesem Tag 365 Tage hinzu (es kann jedoch N Tage sein), indem die DateTime-Klasse und ihre Methode modify () und format ( ):

echo (new DateTime((new DateTime())->modify('first day of January this year')->format('Y-m-d')))->modify('+365 days')->format('Y-m-d');

0

Da Sie bereits eine Antwort darauf haben, was mit Ihrem Code nicht stimmt, kann ich eine andere Perspektive einbringen, wie Sie generell mit Datumsangaben spielen und Ihr Problem spezifisch lösen können.

Oft stellen Sie ein Problem in Bezug auf die Lösung. Dies ist nur einer der Gründe, warum Sie einen zwingenden Code erhalten. Es ist großartig, wenn es funktioniert; Es gibt nur andere, wohl wartbarere Alternativen. Einer von ihnen ist ein deklarativer Code. Es geht darum zu fragen, was Sie brauchen, anstatt wie Sie dorthin gelangen.

In Ihrem speziellen Fall kann dies wie folgt aussehen. Zuerst müssen Sie herausfinden, wonach Sie suchen, dh Abstraktionen entdecken. In Ihrem Fall brauchen Sie anscheinend ein Datum . Nicht irgendein Datum, sondern das mit einer Standarddarstellung. Angenommen, ISO8601-Datum. Es gibt mindestens zwei Implementierungen: Die erste ist ein Datum, das aus einer ISO8601-formatierten Zeichenfolge (oder einer Zeichenfolge in einem anderen Format) analysiert wurde, und die zweite ist ein zukünftiges Datum, das einen Tag später liegt. Somit könnte der gesamte Code so aussehen:

(new Future(
    new DateTimeParsedFromISO8601('2009-09-30 20:24:00'),
    new OneDay()
))
    ->value();

Weitere Beispiele zum Jonglieren mit Datum und Uhrzeit finden Sie in diesem Beispiel .

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.