2016-05-11 11 views
16

muszę First i Ostatni dzień z poprzedniego miesiąca z wykorzystaniem biblioteki węgla, co starałem się następująco:Jak zdobyć pierwszy i ostatni dzień z poprzedniego miesiąca z węglem - laravel

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

Wynik otrzymuję za $firstDayofPreviousMonth = '2016-04-01' (jako bieżący miesiąc to 5 (maj)) i za $lastDayofPreviousMonth = '2016-05-01'.

Otrzymuję poprawny wynik dla $firstDayofPreviousMonth, ale daje mi to 30 dni wcześniejszego wyniku i daje zły wynik na $lastDayofPreviousMonth.

Czy ktoś może mi w tym pomóc?

Odpowiedz

29

Spróbuj tego:

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

Świetnie działa idealnie :). Dziękujemy – Siddharth

+0

Nie ma za co @ Siddharth. –

+0

Nie dostaje czasu jako 00:00:00 –

12

Wystarczy spróbować

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

+2

To zdecydowanie najlepsza, ponieważ zaczyna się o 00:00 i kończy o 23:59:59. Przyjęte rozwiązanie nie wymaga czasu i może spowodować niewiarygodne wyniki. – rgehan

2

Obecnie istnieje bug ciągu Carbon przy użyciu metody

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

Wyniki błędów podczas zawracania ostatni dzień jako 30 dla tych miesięcy, które mają 31 dni.

IE - jeśli jesteś w marcu i uruchomisz powyższe połączenie, zostanie ono przywrócone 2017-03-30, a nie 2017-03-31 zgodnie z oczekiwaniami.

Jak robiłem między datami operacji I skończył przy użyciu ..

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

ten zakończył się z dniem prawidłowego dateTimeString dla tych dni, które kończą się na 31.

2

z tym ... początek startowych data na 00:00 i data zakończenia wykończenia w 23:59

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

konkretnie odpowiedzieć na pytanie, dlaczego jesteś coraz zły wynik dla $lastDayofPreviousMonth.

Pozwala przełamać to oświadczenie w przykładzie:

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

To pozostawia nas z Nieprawidłowa data - nie ma 31 kwietnia. Dodatkowy dzień jest po prostu dodawany do ostatniej ważnej daty (2016-04-30 + 1), która podaje datę na maj (2016-05-01).

Jak już wspomniano, aby mieć pewność, że tak się nigdy nie stanie, zawsze przestawiaj datę na 1 dzień miesiąca, zanim zrobisz cokolwiek innego (jak co miesiąc ma 1 dzień).

$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 
Powiązane problemy