Das Datum des letzten Monats in PHP abrufen

83

Ich möchte das Datum des letzten Monats erhalten. Ich habe das geschrieben:

$prevmonth = date('M Y');

Welches gibt mir den aktuellen Monat / Jahr. Ich kann nicht sagen, ob ich verwenden strtotimesoll mktime. Etwas zum Zeitstempel? Muss ich danach etwas hinzufügen, um zurückzusetzen, damit das Datum nicht für alle Zeitstempel auf meiner Website in allen Monaten auf den letzten Monat festgelegt wird? Ich versuche RTM, aber es fällt mir schwer, das herauszufinden.

pg.
quelle

Antworten:

205

Es ist einfach, das Datum des letzten Monats zu ermitteln

echo date("Y-n-j", strtotime("first day of previous month"));
echo date("Y-n-j", strtotime("last day of previous month"));

am 3. November kehrt zurück

2014-10-1
2014-10-31
OzzyCzech
quelle
7
Dieser ist nicht gut genug und kann Fehler in Ihrem Code verursachen: $time = strtotime('2011-03-30 01:01:01'); echo date('r', strtotime('-1 month', $time));Dieser wird am Mittwoch, den 02. März 2011 um 01:01:01 Uhr zurückgegeben - nicht im Februar! Verwenden Sie strtotime('first day of previous month')stattdessen
Ostin
@OzzyCzech Es gibt den 1. und 31. Oktober zurück, wenn Sie es am 3. März ausführen?
Der unbekannte
$ data_day_str = strtotime ("vorheriger Monat", strtotime ('2011-03-30 01:01:01')); Sie erhalten Februar 2011.
Rodrigo Serzedello
31
echo strtotime("-1 month");

Dadurch wird der Zeitstempel für den letzten Monat genau ausgegeben. Sie müssen danach nichts mehr zurücksetzen. Wenn Sie es danach in einem englischen Format haben möchten, können Sie den Zeitstempel mit date () formatieren, dh:

echo date("Y-m-d H:i:s",strtotime("-1 month"));
Zombat
quelle
12
Heute ist der 31. Oktober 2012. Datum ("Ymd", Strtotime ("- 1 Monat")); Rückgabe 2012-10-01. :(
Todd
7
@toddsler Richtig. -1 Monat entspricht dem Schreiben von -30 Tagen, die an bestimmten Daten im Laufe des Jahres entweder 1 Monat überspringen oder im selben Monat bleiben. Seien Sie also bei dieser Methode vorsichtig.
Seidenfeuer
VERWENDEN SIE DIESE LÖSUNG NICHT! Vorherige Kommentare sind korrekt. Sie haben Fehler, die nur am 31. Tag des Monats (oder am 29.30.31. März) ausgelöst werden
Teenager
19
$prevmonth = date('M Y', strtotime("last month"));
Scharrels
quelle
3
Dies ist dasselbe wie Datum ('M Y', Strtotime ("- 1 Monat")). Wenn Sie etwas wie Datum ('M Y', Strtotime ("2017-07-31 letzter Monat")) tun, wird es zurückgegeben 2017-07-01, also sei vorsichtig! Datum ('M Y', strtotime ('2017-07-31 erster Tag des Vormonats')) würde Ihnen geben, was Sie wollen
Shadoweb
12

Falsche Antworten sind:

$lastMonth = date('M Y', strtotime("-1 month"));
$lastDate = date('Y-m', strtotime('last month'));

Der Grund ist, wenn der aktuelle Monat mehr als 30 Tage beträgt, der vorherige Monat jedoch 29 und weniger $ lastMonth mit dem aktuellen Monat identisch ist.

z.B

If $currentMonth = '30/03/2016';
echo $lastMonth = date('m-Y', strtotime("-1 month")); => 03-2016
echo $lastDate = date('Y-m', strtotime('last month')); => 2016-03

Die richtige Antwort lautet:

echo date("m-Y", strtotime("first day of previous month")); => 02-2016
echo sprintf("%02d",date("m")-1) . date("-Y"); => 02-2016
echo date("m-Y",mktime(0,0,0,date("m")-1,1,date("Y"))); => 02-2016
Wut
quelle
1
Ich würde upvote, wenn Sie echo sprintf ("% 02d", Datum ("m") - 1) entfernen. Datum ("- Y"); => 02-2016. Wenn wir im Januar sind, antwortet es auf Monat 0 dieses Jahres, nicht auf 12 des letzten Jahres!
Tama
6

Wenn Sie nur den Vormonat erhalten möchten, können Sie Folgendes verwenden

$prevmonth = date('M Y', strtotime('-1 months'));

Wenn Sie die gleichen Tage des Vormonats erhalten möchten, können Sie Folgendes verwenden:

$prevmonth = date('M Y d', strtotime('-1 months'));

Wenn Sie das letzte Datum des Vormonats erhalten möchten, können Sie Folgendes verwenden ...

$prevmonth = date('M Y t', strtotime('-1 months'));

Wenn Sie das erste Datum des Vormonats erhalten möchten, können Sie Folgendes verwenden ...

$prevmonth = date('M Y 1', strtotime('-1 months'));
Md. Maruf Hossain
quelle
3
Seien Sie vorsichtig für den 31. des Monats! Es gibt Ihnen den 1. des laufenden Monats! Siehe oben.
Shadoweb
6
echo date('Y',strtotime("-1 year"));        //last year<br>
echo date('d',strtotime("-1 day"));     //last day<br>
echo date('m',strtotime("-1 month"));       //last month<br>
Vaishu
quelle
3
Diese Antwort ist nicht korrekt, wenn das aktuelle Datum der 31.03.2018 ist. Detail auch so
Ngoc Nam
4

Fand dies falsch, wenn die vorherigen Monate kürzer als aktuell sind.

echo date("Y-m-d H:i:s",strtotime("-1 month"));

Versuchen Sie es am 30. März und Sie erhalten 2012-03-01 statt 2012-02 ...

An einer besseren Lösung arbeiten ...

Jay_69
quelle
3
Diese Antwort ist richtig (-1 Monat funktioniert nicht in allen Fällen richtig). Verwenden Sie für den Vormonat strtotime ('letzter Monat').
Mike
1
Letzter Monat oder -1 Monat gibt den gleichen Wert zurück.
Etienne Dupuis
3
public function getLastMonth() {
    $now = new DateTime();
    $lastMonth = $now->sub(new DateInterval('P1M'));
    return $lastMonth->format('Ym');
}

quelle
1
Funktioniert nicht 2015-10-31in PHP 5.5 und 5.6.11. Sie erhalten 201510- das gleiche Verhalten wie bei strtotime('- 1 month).
pmayer
2
$lastMonth = date('M Y', strtotime("-1 month"));
var_dump($lastMonth);
$lastMonth = date('M Y', mktime(0, 0, 0, date('m') - 1, 1, date('Y')));
var_dump($lastMonth);
blutige numen
quelle
4
Während der Code selbst etwas selbsterklärend sein kann, ist es für andere Benutzer hilfreich, Ihre Antwort zu erklären, anstatt nur Code anzugeben.
Turnerj
1

Sie können verwenden strtotime, was in solchen Situationen großartig ist:

$timestamp = strtotime('-1 month');
var_dump(date('Y-m', $timestamp));

Kriege dich :

string '2009-11' (length=7)
Pascal MARTIN
quelle
1
$time = mktime(0, 0, 0, date("m"),date("d")-date("t"), date("Y"));
$lastMonth = date("d-m-Y", $time);

ODER

$lastMonth = date("m-Y", mktime() - 31*3600*24);

arbeitet am 30.03.2012

Paul
quelle
1

Oh, ich habe das herausgefunden, bitte ignorieren Sie es, es sei denn, Sie haben das gleiche Problem wie in diesem Fall:

$prevmonth = date("M Y",mktime(0,0,0,date("m")-1,1,date("Y")));
pg.
quelle
1

Verwenden Sie diesen Funktionscode, um den Vormonat für ein bestimmtes Datum abzurufen:

$tgl = '25 january 2012';

$prevmonth = date("M Y",mktime(0,0,0,date("m", strtotime($tgl))-1,1,date("Y", strtotime($tgl))));
echo $prevmonth;

Das Ergebnis ist Dezember 2011. Arbeitet an einem Monat mit kürzerem Tag als im Vormonat.

abdul
quelle
1

Die beste Lösung, die ich gefunden habe, ist folgende:

function subtracMonth($currentMonth, $monthsToSubtract){
        $finalMonth = $currentMonth;
        for($i=0;$i<$monthsToSubtract;$i++) {
            $finalMonth--;
            if ($finalMonth=='0'){
                $finalMonth = '12';
            }

        }
        return $finalMonth;

    }

Wenn wir also in 3 (März) sind und 5 Monate abziehen wollen, wäre das

subtractMonth(3,5);

das würde 10 (Oktober) geben. Wenn das Jahr auch gewünscht wird, könnte man dies tun:

function subtracMonth($currentMonth, $monthsToSubtract){
    $finalMonth = $currentMonth;
    $totalYearsToSubtract = 0;
    for($i=0;$i<$monthsToSubtract;$i++) {
        $finalMonth--;
        if ($finalMonth=='0'){
            $finalMonth = '12';
            $totalYearsToSubtract++;
        }

    }
    //Get $currentYear
    //Calculate $finalYear = $currentYear - $totalYearsToSubtract 
    //Put resulting $finalMonth and $finalYear into an object as attributes
    //Return the object

}
Rafael Anschau
quelle
0

Für mich geht das:

Heute ist der 31.03.2012

echo date("Y-m-d", strtotime(date('m', mktime() - 31*3600*24).'/01/'.date('Y').' 00:00:00')); // 2012-02-01
echo  date("Y-m-d", mktime() - 31*3600*24); // 2012-02-29
Yiannis Christodoulou
quelle
Funktioniert nur in 58,3 (3)% der Fälle. Was ist mit Februar, April, Juni, September und November? Sie haben keine 31 Tage.
Taz
0

Wenn Sie das erste Datum des Vormonats erhalten möchten, können Sie Folgendes verwenden: $prevmonth = date('M Y 1', strtotime('-1 months'));Was? Das erste Datum ist immer 1: D.

user2846324
quelle
31. Oktober 2012. Rückkehr 2012-10-01
Akira Yamamoto
0

Diese Frage ist ziemlich alt, aber hier geht es trotzdem. Wenn Sie versuchen, nur den Vormonat und den Tag abzurufen, können Sie Folgendes verwenden:

$date = '2014-01-03';

$dateTime = new DateTime($date);

$lastMonth = $dateTime->modify('-' . $dateTime->format('d') . ' days')->format('F Y');

echo $lastMonth; // 'December 2013'
Jay Kravetz
quelle
0

Einfach letzten Monat bekommen.

Beispiel:

Heute ist: 2020-09-02

Code:

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

Ergebnis:

2020-08-02

SL-phpdeveloper
quelle
Willkommen bei StackOverflow! Wahrscheinlich sollten Sie auch überlegen, was passiert, wenn der Tag ist 31und der Monat nicht Januar oder August ist (wie es 2020 May 31wird 2020 April 31, das gibt es nicht)
xKobalt