2016-05-11 25 views
16

ho bisogno Prima e Last Day di mese precedente utilizzando carbonio Biblioteca, quello che ho provato è il seguente:Come arrivare primo e ultimo giorno del mese precedente con Carbon - laravel

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

Risultato che sto ottenendo è per $firstDayofPreviousMonth = '2016-04-01' (come mese corrente è il 5 (maggio)) e per $lastDayofPreviousMonth = '2016-05-01'.

Ho ottenuto il risultato corretto per $firstDayofPreviousMonth, ma mi sta dando un risultato precedente di 30 giorni e mi dà risultato errato per $lastDayofPreviousMonth.

Qualcuno può aiutarmi con questo?

risposta

29

Prova questo:

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

Ottimo funziona perfettamente :). Grazie – Siddharth

+0

Siete i benvenuti @Siddharth. –

+0

Non riceve l'ora 00:00:00 –

12

Basta provare questo

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

+2

Questo è sicuramente il migliore, poiché inizia alle 00:00 e termina alle 23:59:59. La soluzione accettata non tiene conto del tempo e potrebbe produrre risultati inaffidabili. – rgehan

2

Non ci sono attualmente un bug all'interno di carbonio quando si utilizza il metodo

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

I risultati bug nella restituzione del l'ultimo giorno come 30 per quei mesi che hanno 31 giorni.

IE - se si è in marzo e si esegue la chiamata sopra, restituirà 2017-03-30 e non 2017-03-31 come ci si aspetterebbe.

Mentre stavo facendo una tra le date operazione ho finito per usare ..

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

Questa finito con la data corretta dateTimeString per quei giorni che si concludono il 31.

2

Con questo ... la data di inizio init in 00:00 e data di fine fine a 23:59

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

Per rispondere specificamente alla tua domanda sul motivo per cui si sta ottenendo il risultato sbagliato per $lastDayofPreviousMonth.

Lets abbattere questa dichiarazione nel tuo esempio:

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

Questo ci lascia con una data non valida - non v'è alcuna 31 aprile. Il giorno in più viene semplicemente aggiunto all'ultima data valida (30-04-2016 + 1) che porta la data a maggio (01-05-2016).

Come accennato in precedenza per essere sicuri che ciò non accada, resettare sempre la data al 1 ° del mese prima di fare qualsiasi altra cosa (dato che ogni mese ha un 1 ° giorno).

$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