Leon Bunlarda sorun yok, sorun tarihleri dönüştürürken pratik bir yol bulmak. Ya DB düzeyinde dönüşüm olacak ya da PHP düzeyinde. PHP düzeyinde olunca yazdığınız her tarihi 2 kez düşünüp yazmanız lazım:
$date = Carbon::parse('2020-12-01T00:00:00+0300');
// 2020-11-30 21:00:00. Doğru
$date->utc();
// 2020-11-01 00:00:00. Yanlış, istediğiniz büyük ihtimalle 2020-11-30 21:00:00
$startOfMonth = $date->copy()->startOfMonth();
// 2020-11-30 23:59:59. Yanlış, istediğiniz büyük ihtimalle 2020-12-31 20:59:59
$endOfMonth = $date->copy()->endOfMonth();
Yapılması gereken (tekrar Europe/Istanbul zaman dilimine dönüşüm yapmamak için)
$date = CarbonImmutable::parse('2020-12-01T00:00:00+0300');
$startOfMonth = $date->startOfMonth()->utc(); // 2020-11-30 21:00:00
$endOfMonth = $date->endOfMonth()->utc(); // 2020-12-31 20:59:59
Ayrıca saat farkından dolayı bazı kayıtların bir gün önce ya da sonra işlenmesi olabildiği için şunu yapamıyorsunuz:
$date = Carbon::parse('2020-12-01T00:00:00+0300')->utc();
// whereDate kullandığınızda ya 2020-11-30 kayıtları gelir ya da 2020-12-01.
// Bu sorgu eksik kayıt getirecek, UTC kullanın ya da kullanmayın
// O yüzden whereBetween kullanılması lazım.
$users = User::whereDate('created_at', $date)->get();
Doğru olan
$date = CarbonImmutable::parse('2020-12-01T00:00:00+0300');
$startOfDay= $date->startOfDay()->utc();
$endOfDay = $date->endOfDay()->utc();
$users = User::whereBetween('created_at', [
$startOfDay,
$endOfDay
])->get();
Gördüğünüz gibi basit bir işleme bir kat yük bindi. Benim amacım buna basit bir çözüm bulabilmek. Projede kod yazan tek kişi olmuyorsunuz, siz yapıp anlayabilirsiniz kendi yazdığınızı ama tüm ekibin rahat kullanabileceği bir şeyler ortaya çıkarmak lazım, asıl konu bu.