2016-05-11 19 views
16

Tôi cần Đầu tiênngày cuối của Tháng Previous sử dụng Thư viện Carbon, những gì tôi đã cố gắng thực hiện như sau:Làm thế nào để có được đầu tiên và cuối Ngày trong tháng trước với Carbon - Laravel

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

Kết quả tôi nhận được là dành cho $firstDayofPreviousMonth = '2016-04-01' (như tháng hiện tại là ngày 5 (tháng 5)) và cho $lastDayofPreviousMonth = '2016-05-01'.

Tôi nhận được kết quả chính xác cho $firstDayofPreviousMonth, nhưng nó cho tôi kết quả trước 30 ngày và cho tôi kết quả sai cho $lastDayofPreviousMonth.

Có ai có thể giúp tôi với điều này không?

Trả lời

29

Hãy thử điều này:

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

Tuyệt vời nó hoạt động hoàn hảo :). Cảm ơn bạn – Siddharth

+0

Bạn được chào đón @Siddharth. –

+0

Không nhận được thời gian như 00:00:00 –

12

Chỉ cần cố gắng này

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

+2

Đây chắc chắn là điều tốt nhất, vì nó bắt đầu lúc 00:00 và kết thúc lúc 23:59:59. Giải pháp được chấp nhận không mất thời gian và có thể tạo ra kết quả không đáng tin cậy. – rgehan

2

hiện Có một lỗi trong vòng Carbon khi sử dụng phương pháp này

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

Kết quả lỗi trong trả lại ngày cuối cùng là 30 cho những tháng có 31 ngày.

IE - nếu bạn vào tháng 3 và bạn thực hiện cuộc gọi ở trên, nó sẽ quay trở lại 2017-03-30 và không phải 2017-03-31 như bạn mong đợi.

Khi tôi đang làm một giữa ngày hoạt động tôi đã kết thúc sử dụng ..

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

này đã kết thúc với dateTimeString ngày chính xác cho những ngày mà kết thúc vào ngày 31.

2

Với điều này ... ngày bắt đầu init vào 00:00 và ngày kết thúc kết thúc trong 23:59

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

Để trả lời câu hỏi của bạn đặc biệt là tại sao bạn đang nhận được kết quả sai cho $lastDayofPreviousMonth.

Cho phép phá vỡ tuyên bố này trong ví dụ của bạn:

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

này khiến cho chúng ta một ngày không hợp lệ - không có ngày 31 tháng 4. Ngày bổ sung chỉ đơn giản là được thêm vào ngày hợp lệ cuối cùng (2016-04-30 + 1) mà cuộn ngày tháng năm (2016-05-01).

Như đã đề cập trước đây để đảm bảo điều này không bao giờ xảy ra, hãy luôn đặt lại ngày 1 của tháng trước khi thực hiện bất kỳ điều gì khác (như mỗi tháng có ngày đầu tiên).

$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 
Các vấn đề liên quan