Herkese merhaba.
Hep siz soruyordunuz, bu sefer ben sorayım. Uygulamam UTC zaman dilimi kullanıyor olsun, yani config/app.php içinde locale değeri UTC ve aynı şekilde php.ini içerisinde de date.timezone değeri UTC. Frontend bana tarih gönderdiği zaman ISO8601 formatında gönderiyor. Örneğin 2020-12-15T12:35:00+0300 şeklinde. Timezone verisi de geldiği için ben bu tarihi UTC'ye çevirip veritabanına kaydediyorum
Burada siz bu çevirme işlemini yapmadan kayıt yapıyorsanız 2020-12-15 09:35:00 yerine veritabanına 2020-12-15 12:35:00 şeklinde Türkiye saatini UTC olarak yazacaktır. Yani yanlış yaptınız.
Şöyle bir durum var. 2020-12-01T01:00:00+0300 şeklinde Türkiye saati ile 1 Aralık 01:00 tarihini veritabanına UTC olarak kaydettiğinizde 2020-11-30 22:00:00 şeklinde, yani 30 Kasım 22:00 olarak kaydedersiniz. Türkiye GMT+3 olduğu için UTC'ye dönüşüm sırasında 3 saat eksilecek ve gece 00:00 - 03:00 arası kayıtların tarihleri bir gün önce gözükecek ve ay başı ise bir önceki ay içerisinde yer alacaktır.
$date = Carbon::parse('2020-12-01');
$users = User::whereDate('registered_at', $date)->get();
Yanlış yaptınız. Bu sorgu size Türkiye saati ile 1 Aralık günü 00:00 - 03:00 saatleri arasında kayıt olan kullanıcıları vermeyecektir. Kayıtlar eksik olacaktır.
$date = Carbon::parse('2020-12-01');
$users = User::whereBetween('registered_at', [
$date->startOfDay(),
$date->endOfDay()
])->get();
Yine yanlış yaptınız. Başlangıç ve bitiş tarihlerine bakalım ne vermişiz:
[
"2020-12-01 00:00:00",
"2020-12-01 23:59:59",
]
Gördüğünüz gibi gün başından 3 saatlik veri eksik olduğu gibi gün sonunda da fazladan diğer günden 3 saatlike veriyi aldık. Peki tarih aralığı nasıl olmalıydı? Şöyle olması gerekiyordu:
[
"2020-11-30 21:00:00",
"2020-12-01 20:59:59",
]
Ben bu doğru tarihlere nasıl ulaştım:
$date = CarbonImmutable::parse('2020-12-01', 'Europe/Istanbul');
$dates = [
$date->startOfDay()->utc(),
$date->endOfDay()->utc()
]
Gördüğünüz gibi burada timezone değerini elle verdim, Europe/Istanbul şeklinde. Normal şartlarda bunu kullanıcının içerisinde tutmak gerekiyor. Yani pek de kolay ve pratik bir şekilde elde edemedim.
Bu aşamaya kadar bunları düşünmediyseniz yaptıklarınız ve elde ettiğiniz sonuçlar ne yazık ki yanlış.
Bu şekilde örnekleri çoğaltabilirim. Benim sormak istediğim ise:
- Bunları daha önce hiç düşündünüz mü?
- Düşündüyseniz ve buna pratik bir çözüm bulduysanız burada paylaşabilir misiniz?
Cevap verirken uygulamanın Türkiye dışında da kullanılacağını unutmayın, o yüzden Europe/Istanbul ile çalışmak bir seçenek değil.
Örnek olarak şu tabloyu kullanabilirsiniz. Bu tabloda sadece * ile işaretli olan kayıtlar 2020-12-01 tarihinde kayıt olan kullanıcılardır (evet, ne yazık ki)
+---------+---------------------+---+
| user_id | registered_at | |
+---------+---------------------+---+
| 1 | 2020-11-30 19:00:00 | |
| 2 | 2020-11-30 19:30:00 | |
| 3 | 2020-11-30 20:59:00 | |
| 4 | 2020-11-30 21:20:00 | * |
| 5 | 2020-11-30 21:40:00 | * |
| 6 | 2020-11-30 22:10:00 | * |
| 7 | 2020-11-30 23:15:00 | * |
| 8 | 2020-12-01 00:15:00 | * |
| 9 | 2020-12-01 00:30:00 | * |
| 10 | 2020-12-01 04:25:00 | * |
| 11 | 2020-12-01 16:25:00 | * |
| 12 | 2020-12-01 20:58:00 | * |
| 13 | 2020-12-01 21:02:00 | |
| 14 | 2020-12-01 23:55:00 | |
+---------+---------------------+---+
Bu 2020-12-01 tarihinde kayıt olan kullanıcılara nasıl ulaşırdınız?