Dieses Verhalten ist (bis zu einem gewissen Punkt) aufgrund der unterschiedlichen Anzahl von Tagen im Februar und März verständlich, und der Code im obigen Beispiel ist das, was ich brauche, funktioniert aber nur zwischen dem 1. und 28. eines jeden Monats zu 100% korrekt.
Also, wie man den letzten Monat UND das letzte Jahr bekommt (denke an date("Y-m")) auf die eleganteste Art und Weise, die für jeden Tag des Jahres funktioniert? Optimale Lösung basiert auf strtotime Argumentanalyse.
Aktualisieren. Um die Anforderungen etwas zu verdeutlichen.
Ich habe einen Code, der einige Statistiken der letzten Monate abruft, aber ich zeige zuerst die Statistiken des letzten Monats und lade dann bei Bedarf andere Monate. Das ist beabsichtigter Zweck. Während DIESES Monats möchte ich also herausfinden, welches Monat-Jahr ich ziehen soll, um die Statistiken des VORHERIGEN Monats zu laden.
Ich habe auch einen Code, der die Zeitzone berücksichtigt (im Moment nicht wirklich wichtig) und der akzeptiert strtotime-kompatible Zeichenfolge als Eingabe (um das interne Datum zu initialisieren) und ermöglicht dann die Anpassung von Datum/Uhrzeit, ebenfalls mit strtotime-kompatible Saiten.
Ich weiß, dass dies mit wenigen Bedingungen und grundlegender Mathematik möglich ist, aber das ist im Vergleich zum Beispiel wirklich chaotisch (wenn es natürlich richtig funktioniert hat):
echo tz::date('last month')->format('Y-d')
Also brauche ich NUR den vorherigen Monat und das Jahr in a strtotime-kompatible Mode.
Antwort (Danke, @dnagirl):
// Today is 2011-03-30
echo date('Y-m-d', strtotime('first day of last month')); // Output: 2011-02-01
Alles was du willst ist Monat und Jahr? kein Tag?
– Naftali
30. März 11 um 17:01 Uhr
Könnten Sie genau erläutern, welche Eingaben/Ausgaben und erwartetes Verhalten Sie wünschen?
– Jarrod Brennnesseln
30. März 11 um 17:02 Uhr
date(“mY”, strtotime(“-1 Monate”)); würde das lösen
– Varshaan
9. Oktober 19 um 7:16 Uhr
@Varshaan danke für deinen Kommentar! Bitte erstellen Sie stattdessen eine Antwort, anstatt Lösungen über Kommentare vorzuschlagen. Auf diese Weise kann es zu einer Konversation um Ihre Antwort kommen und Stimmen sammeln.
– Herr B
17. Oktober 19 um 10:17 Uhr
@mr.b stimmte zu und habe als Antwort gepostet
– Varshaan
17. Oktober 19 um 14:21 Uhr
Schauen Sie sich die an DateTime Klasse. Es sollte die Berechnungen korrekt durchführen und die Datumsformate sind kompatibel mit strttotime. Etwas wie:
$datestring='2011-03-30 first day of last month';
$dt=date_create($datestring);
echo $dt->format('Y-m'); //2011-02
Außerdem verwendet meine Funktion tz::date() intern das DateTime-Objekt, um Zeitzonen- oder Zeitanpassungen vorzunehmen.
Die tz-Klasse ist ein bequemer Wrapper um die TzDate-Klasse. Sehen pastebin.com/GzUcvvA0, vielleicht finden Sie es nützlich. Code sollte selbsterklärend sein. tz-Klasse ist da pastebin.com/8mcRu5qe; Es ist jedoch nicht eigenständig, da ich das Kohana-Framework verwende, und es ist mit einigen anderen Klassen verknüpft, die es anbietet.
– Herr B
30. März 11 um 19:46 Uhr
Wenn der Tag selbst keine Rolle spielt, tun Sie dies:
Das kommt heute noch als März heraus. Ich schätze, es wird Februar.
– Codecraft
30. März 11 um 17:51 Uhr
@codecraft dann versuche es so: echo date(‘Ym-d’, strtotime(date(‘Ym-d’).” -1 month”));
– Probleme
30. März 11 um 19:25 Uhr
Für mich geben mir diese beiden Zeilen 2011-03-02. Seltsam.
– Codecraft
30. März 11 um 21:09 Uhr
verdammt >< hatte einen kleinen Fehler: echo date('Ym-d', strtotime(date('Ym-1')." -1 month")); das meine ich
– Probleme
30. März 11 um 22:09 Uhr
@Codecraft “-1 Monat” und “-1 Monat” Ich habe beide ausprobiert und sie ergeben unterschiedliche Antworten, Leerzeichen vor Bindestrich funktioniert: D
– ha_ryu
31. Oktober 18 um 3:58 Uhr
Ich habe eine Antwort gefunden, da ich heute das gleiche Problem hatte, das ein 31. ist. Es ist kein Fehler in php wie manche vermuten lassen, ist doch die erwartete funktionalität (bei manchen da). Demzufolge Post Was strtotime tatsächlich tut, ist den Monat um eins zurückzusetzen und die Anzahl der Tage nicht zu ändern. Im Fall von heute, dem 31. Mai, wird also nach dem 31. April gesucht, was ein ungültiges Datum ist. Also dauert es dann den 30. April und fügt dann 1 Tag danach hinzu und ergibt den 1. Mai.
In Ihrem Beispiel 2011-03-30 würde es einen Monat bis zum 30. Februar zurückgehen, was ungültig ist, da der Februar nur 28 Tage hat. Es nimmt dann die Differenz dieser Tage (30-28 = 2) und bewegt sich dann zwei Tage nach dem 28. Februar, der der 2. März ist.
Wie andere bereits betont haben, ist der beste Weg, um “letzten Monat” zu erhalten, entweder “erster Tag von” oder “letzter Tag von” mit entweder strtotime oder dem DateTime-Objekt hinzuzufügen:
// Today being 2012-05-31
//All the following return 2012-04-30
echo date('Y-m-d', strtotime("last day of -1 month"));
echo date('Y-m-d', strtotime("last day of last month"));
echo date_create("last day of -1 month")->format('Y-m-d');
// All the following return 2012-04-01
echo date('Y-m-d', strtotime("first day of -1 month"));
echo date('Y-m-d', strtotime("first day of last month"));
echo date_create("first day of -1 month")->format('Y-m-d');
Mit diesen ist es also möglich, einen Datumsbereich zu erstellen, wenn Sie eine Abfrage usw.
Timo Huovinen
Wenn Sie das Vorjahr und den Monat relativ zu einem bestimmten Datum wünschen und DateTime verfügbar haben, können Sie dies tun:
$d = new DateTimeImmutable('2013-01-01', new DateTimeZone('UTC'));
$firstDay = $d->modify('first day of previous month');
$year = $firstDay->format('Y'); //2012
$month = $firstDay->format('m'); //12
Marek
date('Y-m', strtotime('first day of last month'));
Dies ist perfekt. Durch die Verwendung des ersten Tages werden Dinge wie der 31. Februar, der 31. Juni usw. verhindert.
– Johnathan Elmore
14. August 14 um 21:19 Uhr
sterbend
strtotime zweite haben timestamp Parameter, die den ersten Parameter relativ zum zweiten Parameter machen. Sie können also Folgendes tun:
date('Y-m', strtotime('-1 month', time()))
Dies ist perfekt. Durch die Verwendung des ersten Tages werden Dinge wie der 31. Februar, der 31. Juni usw. verhindert.
– Johnathan Elmore
14. August 14 um 21:19 Uhr
Wenn ich die Frage richtig verstehe, wollen Sie nur den letzten Monat und das Jahr, in dem es ist:
Alles was du willst ist Monat und Jahr? kein Tag?
– Naftali
30. März 11 um 17:01 Uhr
Könnten Sie genau erläutern, welche Eingaben/Ausgaben und erwartetes Verhalten Sie wünschen?
– Jarrod Brennnesseln
30. März 11 um 17:02 Uhr
date(“mY”, strtotime(“-1 Monate”)); würde das lösen
– Varshaan
9. Oktober 19 um 7:16 Uhr
@Varshaan danke für deinen Kommentar! Bitte erstellen Sie stattdessen eine Antwort, anstatt Lösungen über Kommentare vorzuschlagen. Auf diese Weise kann es zu einer Konversation um Ihre Antwort kommen und Stimmen sammeln.
– Herr B
17. Oktober 19 um 10:17 Uhr
@mr.b stimmte zu und habe als Antwort gepostet
– Varshaan
17. Oktober 19 um 14:21 Uhr