最初のと最終日の前月が必要です。CarbonLibraryを使用して、私が試したのは次のとおりです。
$firstDayofPreviousMonth = Carbon::now()->startOfMonth()->subMonth()->toDateString();
$lastDayofPreviousMonth = Carbon::now()->endOfMonth()->subMonth()->toDateString();
結果はfor$firstDayofPreviousMonth = '2016-04-01'
(現在の月は5月(5月)であるため)および$lastDayofPreviousMonth = '2016-05-01'
です。
$firstDayofPreviousMonth
の正しい結果が得られますが、30日前の結果が得られ、$lastDayofPreviousMonth
の結果が間違っています。
誰でもこれで私を助けることができますか?
これを試して:
$start = new Carbon('first day of last month');
$end = new Carbon('last day of last month');
これを試してみてください
$firstDayofPreviousMonth = Carbon::now()->startOfMonth()->subMonth()->toDateString(); $lastDayofPreviousMonth = Carbon::now()->subMonth()->endOfMonth()->toDateString();
これにより、日付は00:00にinitを開始し、23:59に終了します
$start = new Carbon('first day of last month');
$start->startOfMonth();
$end = new Carbon('last day of last month');
$end->endOfMonth();
$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.
これにより、無効な日付が残ります。4月31日はありません。余分な日は最後の有効な日付(2016-04-30 + 1)に追加されるだけで、日付は5月(2016-05-01)にロールされます。
これが絶対に起こらないことを確認するために前述したように、他の何かをする前に常に日付を月の1日にリセットします(毎月1日があるため)。
$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
現在、このメソッドを使用するとCarbon内にバグがあります
Carbon::now()->startOfMonth()->subMonth()->endOfMonth()->toDateTimeString();
このバグにより、31日間ある月については最終日が30として返されます。
IE-3月に上記の呼び出しを実行すると、予想どおり2017-03-31ではなく2017-03-30が返されます。
日付間の操作を行っていたので、最終的に使用しました。
Carbon::now()->startOfMonth()->subSeconds(1)->toDateTimeString();
これは、31日で終了する日付の正しい日付dateTimeStringになりました。