Wie bekomme ich den vorherigen Monat und das Jahr relativ zum heutigen Tag mit strtotime und date?

Lesezeit: 6 Minuten

Wie bekomme ich den vorherigen Monat und das Jahr relativ
Herr B

Ich muss den vorherigen Monat und das Jahr relativ zum aktuellen Datum abrufen.

Siehe jedoch folgendes Beispiel.

// Today is 2011-03-30
echo date('Y-m-d', strtotime('last month'));

// Output:
2011-03-02

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.

    – Herr B

    30. März 11 um 17:58 Uhr

  • @mr.b: Ich bin froh, dass ich helfen konnte. Verwenden Sie die Klasse DateTimeZone in Ihrer Funktion tz::date()? ca2.php.net/manual/en/class.datetimezone.php

    – DNA-Mädchen

    30. März 11 um 18:27 Uhr

  • 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:

echo date('Y-m-d', strtotime(date('Y-m')." -1 month"));

  • 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.

Wie bekomme ich den vorherigen Monat und das Jahr relativ
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

1643913247 166 Wie bekomme ich den vorherigen Monat und das Jahr relativ
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

1643913247 478 Wie bekomme ich den vorherigen Monat und das Jahr relativ
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:

<?php

  $month = date('m');
  $year = date('Y');
  $last_month = $month-1%12;
  echo ($last_month==0?($year-1):$year)."-".($last_month==0?'12':$last_month);

?>

Hier ist das Beispiel: http://codepad.org/c99nVKG8

.

758710cookie-checkWie bekomme ich den vorherigen Monat und das Jahr relativ zum heutigen Tag mit strtotime und date?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy