2016-05-11 2 views
16

I Erste und Schlußtag von Vorheriger Monat mit Hilfe von Kohlenstoff-Bibliothek benötigen, was ich versucht habe, ist wie folgt:Wie erste und letzte Tag des Vorheriger Monat mit Kohlenstoff bekommen - Laravel

$firstDayofPreviousMonth = Carbon::now()->startOfMonth()->subMonth()->toDateString(); 
$lastDayofPreviousMonth = Carbon::now()->endOfMonth()->subMonth()->toDateString(); 

Ergebnis Ich bekomme ist für $firstDayofPreviousMonth = '2016-04-01' (als aktueller Monat ist 5. (Mai)) und für $lastDayofPreviousMonth = '2016-05-01'.

Ich bekomme das korrekte Ergebnis für $firstDayofPreviousMonth, aber es gibt mir 30 Tage vorheriges Ergebnis, und gab mir ein falsches Ergebnis für $lastDayofPreviousMonth.

Kann mir jemand dabei helfen?

Antwort

29

Try this:

$start = new Carbon('first day of last month'); 
$end = new Carbon('last day of last month'); 
+0

Großartig es funktioniert perfekt :). Danke – Siddharth

+0

Gern geschehen @Siddharth. –

+0

Er bekommt nicht die Zeit 00:00:00 –

12

Probieren Sie diese

$firstDayofPreviousMonth = Carbon::now()->startOfMonth()->subMonth()->toDateString(); $lastDayofPreviousMonth = Carbon::now()->subMonth()->endOfMonth()->toDateString();

+2

Dies ist definitiv das beste, wie es um 00:00 beginnt und um 23:59:59 endet. Die akzeptierte Lösung benötigt keine Zeit und kann zu unzuverlässigen Ergebnissen führen. – rgehan

2

Es gibt derzeit einen Bug im Kohlenstoff, wenn das Verfahren unter Verwendung von

Carbon::now()->startOfMonth()->subMonth()->endOfMonth()->toDateTimeString(); 

Der Fehler führt zu der Rückkehr Letzter Tag als 30 für die Monate, die 31 Tage haben.

IE - wenn Sie im März sind und Sie den oben genannten Anruf ausführen, wird es 2017-03-30 und nicht 2017-03-31 zurückgeben, wie Sie erwarten würden.

Als ich eine zwischen diesen Zeitbetrieb zu tun ich am Ende mit ..

Carbon::now()->startOfMonth()->subSeconds(1)->toDateTimeString(); 

Damit endete für die Tage mit dem richtigen Datum dateTimeString, die auf dem 31. beenden.

2

Damit ... das Datum Beginn init am 00.00 und Datum Ende Finish in 23:59

$start = new Carbon('first day of last month'); 
$start->startOfMonth(); 
$end = new Carbon('last day of last month'); 
$end->endOfMonth(); 
0

speziell auf Ihre Frage zu beantworten, warum sind Sie für $lastDayofPreviousMonth das falsche Ergebnis.

Lässt diese Aussage in Ihrem Beispiel brechen:

Carbon::now()->endOfMonth()->subMonth()->toDateString(); 
// Carbon::now() > 2016-05-05 
// ->endOfMonth() > 2016-05-31 
// ->subMonth() > 2016-04-31 // Simply takes 1 away from 5. 

Dies lässt uns mit einem ungültigen Datum - es gibt keine 31. April. Der zusätzliche Tag wird einfach zum letzten gültigen Datum hinzugefügt (2016-04-30 + 1), das das Datum in Mai (2016-05-01) rollt.

Wie bereits erwähnt, um sicherzustellen, dass dies nie passiert, setzen Sie das Datum immer auf den 1. des Monats zurück, bevor Sie etwas anderes tun (da jeder Monat einen ersten Tag hat).

$lastDayofPreviousMonth = Carbon::now()->startofMonth()->subMonth()->endOfMonth()->toDateString(); 
// Carbon::now() > 2016-05-05 
// ->startofMonth() > 2016-05-01 00:00:00 
// ->subMonth() > 2016-04-01 00:00:00 
// ->endOfMonth() > 2016-04-30 23:59:59