PHP'de Tarih ve Saat Dilimi: DateTimeImmutable ile Hatasız Hesap
PHP'de Tarih ve Saat Dilimi: DateTimeImmutable ile Hatasız Hesap hakkında dağınık bilgiler yerine derli toplu bir kaynak arıyorsanız doğru yerdesiniz. Bu yazı 5 temel noktayı ve bunları bir araya getiren PHP örneğini sade bir dille açıklıyor.
PHP'de Tarih ve Saat Dilimi: DateTimeImmutable ile Hatasız Hesap hakkında dağınık bilgiler yerine derli toplu bir kaynak arıyorsanız doğru yerdesiniz. Bu yazı 5 temel noktayı ve bunları bir araya getiren PHP örneğini sade bir dille açıklıyor.
Konuya genel bakış
Sunucu saati UTC, veritabanı saati başka, kullanıcı İstanbul'da: tarih hatalarının çoğu saat dilimlerinin karışmasından doğar. DateTime nesnesinin yerinde değişmesi de "bir tarihe 30 gün ekledim, başka bir değişkenim de değişti" türünden hatalara yol açar. DateTimeImmutable ve açık saat dilimi kullanımı bu iki sorunu birlikte çözer.
Öne çıkan noktalar
- Immutable tercih edin: DateTimeImmutable üzerindeki her işlem yeni bir nesne döndürür; orijinal tarih yanlışlıkla değişmez.
- Saklarken UTC: Veritabanında UTC saklayıp yalnız gösterirken kullanıcının saat dilimine çevirmek, yaz saati ve sunucu taşıma sorunlarını önler.
- Varsayılan dilimi belirleyin: date_default_timezone_set ya da php.ini içindeki date.timezone ayarı yapılmazsa sunucuya göre farklı sonuç alırsınız.
- Ay sonu tuzağı: 31 Ocak tarihine "+1 month" eklemek Mart başına taşar; ay sonu hesabında "last day of next month" ifadesini kullanın.
- Fark hesabı: diff() ile alınan DateInterval nesnesinin days özelliği iki tarih arasındaki toplam gün sayısını verir.
PHP ile uygulama
Aşağıdaki PHP örneği, yukarıdaki noktaların gerçek bir kodda nasıl bir araya geldiğini gösteriyor:
date_default_timezone_set('Europe/Istanbul');
$simdi = new DateTimeImmutable(); // İstanbul saati
$bitis = $simdi->modify('+30 days')->setTime(23, 59, 59);
echo $simdi->format('d.m.Y H:i'); // $simdi değişmedi
// Veritabanına UTC olarak yaz
$utc = $bitis->setTimezone(new DateTimeZone('UTC'))->format('Y-m-d H:i:s');
// Veritabanından gelen UTC değerini kullanıcıya göster
$kayit = new DateTimeImmutable('2026-11-15 09:30:00', new DateTimeZone('UTC'));
echo $kayit->setTimezone(new DateTimeZone('Europe/Istanbul'))->format('d.m.Y H:i'); // 15.11.2026 12:30
// İki tarih arasındaki fark
echo $simdi->diff($bitis)->days . ' gün kaldı';Kodu doğrudan kopyalamak yerine her satırın ne yaptığını anlayarak uyarlamanız, ileride çıkacak hataları çözmeyi kolaylaştırır.
Canlı sunucuda display_errors kapalı olmalı; hataları kullanıcıya göstermek yerine günlüğe yazdırın.
Neden önemli? Kazanımlar
Bu yaklaşımı benimsediğinizde elde edeceğiniz başlıca faydalar:
- Kullanıcılar dünyanın neresinde olursa olsun doğru saati görür
- Yan etkili tarih değişikliklerinden doğan hatalar biter
- Sunucu taşındığında tarih verisi bozulmaz
Özetle
Bu yazı boyunca PHP'de Tarih ve Saat Dilimi: DateTimeImmutable ile Hatasız Hesap konusunun temel taşlarını ve uygulamada dikkat edilmesi gerekenleri gördük. Özellikle Immutable tercih edin ve Fark hesabı başlıklarını uygulamaya geçirmek iyi bir başlangıç olur.
İlgili içerikler:
- MySQL İndeksleri ile Sorgu Hızlandırma
- JavaScript Fetch API ve async/await ile Veri Çekme
- Tailwind CSS ile Titreşimsiz Dark Mode
Daha fazla uygulamalı içerik için Akademi derslerine ve blog yazılarına göz atabilirsiniz.
Yazar
Ferdi Giden @adminPHP, MySQL ve Tailwind ile kurumsal yazılımlar geliştiriyor; FerdiSoft çatısı altında ERP, WMS ve SaaS çözümleri üretiyor.