2016-05-11 216 views
16

我需要首先最後一天使用碳庫,我曾嘗試如下:上個月的:如何獲得上月的第一天和最後一天與碳 - Laravel

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

結果我得到的是$firstDayofPreviousMonth = '2016-04-01'(當前月份是第5(5月))和$lastDayofPreviousMonth = '2016-05-01'

我得到正確的結果爲$firstDayofPreviousMonth,但它給了我30天以前的結果,並給我錯誤的結果爲$lastDayofPreviousMonth

任何人都可以幫我解決這個問題嗎?

回答

29

試試這個:

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

太棒了,它完美的作品:)。謝謝 – Siddharth

+0

不客氣@Siddharth。 –

+0

沒有獲得時間00:00:00 –

12

剛剛嘗試這一點

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

+2

這絕對是最好的,因爲它始於00:00,結束於23:59:59。接受的解決方案沒有考慮到時間,可能會產生不可靠的結果。 – rgehan

2

在返回的使用方法

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

的錯誤結果時,目前的碳中的錯誤最後一天爲那些有31天的月份的30天。

IE瀏覽器 - 如果你是在3月份,並且運行上述調用,它將返回2017-03-30,而不是你所期望的2017-03-31。

當我在做我最後使用日期之間的操作..

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

這結束了正確的日期dateTimeString對於那些在31日的結束日。

2

這... ...在23:59

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

在00:00和日期結束結束日期開始初始化具體回答你的問題,爲什麼你得到錯誤的結果爲$lastDayofPreviousMonth

讓我們打破這種說法在你的榜樣:

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

這給我們留下了一個無效的日期 - 沒有月31日。多餘的日期只需添加到最後一個有效日期(2016年4月30日+ 1),將日期推到5月(2016-05-01)。

如前所述,確保這種永不會發生的事情總是將日期重置爲本月的第一天,然後再做其他事情(因爲每個月都有第一天)。

$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 
相關問題