Frage

Das funktioniert gut gestern ohne Änderungen am Code.

echo date("M", strtotime("-3 month", time()) );
echo date("M", strtotime("-2 month", time()) );
echo date("M", strtotime("-1 month", time()) );
echo date("M", time());

Die Ausgabe, die es gestern produziert wurde, war als würden Sie erwar- d April, Mai, Juni, Juli

Heute hallt Mai Mai Juli Juli

Irgendwelche Ideen?

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Es könnte auf Fehler # 44073

Sie könnten versuchen, mit so etwas wie folgt aus:

echo date("M", strtotime("-3 month", strtotime(date("F") . "1")) ) . "\n";
echo date("M", strtotime("-2 month", strtotime(date("F") . "1")) ) . "\n";
echo date("M", strtotime("-1 month", strtotime(date("F") . "1")) ) . "\n";
echo date("M", time()) . "\n";

(Lösung in den Kommentaren gefunden strtotime ; Link )

Und die Ausgabe:

Apr
May
Jun
Jul

Art der "Betrug" mit dem Datumsformat und Monatsnamen und all das ...

Andere Tipps

Gorden identifiziert richtig die Frage, aber ich wollte eine andere Lösung geben, die hilfreich und nicht als technische. Verwenden Sie einfach „ersten Tag“ oder „letzten Tag“ in Ihrem strtotime. Ex, diese folgenden Beispiele überwinden das Problem auf einem 31. eines Monats:

// Today is May 31st
//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');

Versuchen Sie diese statt strtotime:

mktime(0, (date("n") - 3 + 12) % 12, 1)

Die Idee ist es, den aktuellen Monat Nummer (date("n")) zu nehmen, subtrahieren die Anzahl der Monate von ihm Sie (hier -3) möchten, fügen Sie 12, um es und dann bekommen Modulo 12.

Dies ist bekannt und das erwartete Verhalten. Der Grund dafür ist, dass ein Monat ein relatives Datum ohne feste Länge. Aus http: // www. gnu.org/software/tar/manual/html_node/Relative-items-in-date-strings.html#SEC120

  

Die Einheit der Zeitverschiebung kann durch die Zeichenfolge ‚Jahr‘ oder ‚Monat‘ zum Bewegen von ganzen Jahren oder Monaten gewählt werden. Dies sind Fuzzy-Einheiten, wie Jahre und Monate sind nicht alle von gleicher Dauer. Genauere Einheiten sind ‚zwei Wochen‘, die 14 Tage wert ist, oder ‚Woche‘ im Wert von 7 Tagen ‚Tag‘ im Wert von 24 Stunden ‚Stunde‘ im Wert von 60 Minuten ‚Minute‘ oder ‚min‘ im Wert von 60 Sekunden und ‚zweite‘ ‚s‘ im wert von einer Sekunde. Ein ‚s‘ Suffix auf diesen Einheiten wird akzeptiert und ignoriert.

Folglich (Hervorhebung von mir)

  

Der Flaum in Einheiten kann Probleme mit relativen Produkten verursachen. Zum Beispiel: ‚2003-07-31 -1 Monat‘ könnten 2003-07-01 bewerten, weil 2003.06.31 ein ungültiges Datum ist. Um den vorherigen Monat zuverlässiger zu ermitteln, können Sie für den Monat vor dem 15. des laufenden Monats fragen . Zum Beispiel:

$ date -R
Thu, 31 Jul 2003 13:02:39 -0700
$ date --date='-1 month' +'Last month was %B?'
Last month was July?
$ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!'
Last month was June!

Das oben könnte in PHP als

ausgedrückt werden
echo date('M', strtotime(date('Y-m-') . '15 -1 month'));

Siehe auch die commments unter http://bugs.php.net/bug.php ? id = 22486

Von PHP 5.3 (Ref: https://bugs.php.net/bug. ? php id = 44073 ) und höher Sie tun können:

"first day of +1 month" oder "first day of next month" oder sogar "last day of next month"

Beispiel:

$date = '2015-12-31';

echo date("Y-m-d", strtotime($date ."first day of previous month"));

Wird produzieren. 2015-11-01 Dies gilt nicht Tage auf 30 Tage Zeitbasis berechnen

eine einfache Möglichkeit, es so zu schreiben, könnte

echo date ( "M", strtotime ( "in diesem Jahr 3 Monate"));

oder

echo date ( "M", strtotime ( "in diesem Monat -3 Monate"));

hängt, was es Ihre Verwendung für ..

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top