Web uygulamalarında kullanıcı kayıtları, oturum süreleri, güvenlik günlükleri (log kayıtları) ve zamanlanmış görevler gibi pek çok kritik süreç tarih ve saat verilerine dayanır. Arka uç geliştiricileri için bu verileri doğru biçimlendirmek, zaman dilimlerini yönetmek ve zaman hesaplamaları yapmak temel bir gerekliliktir. PHP, sunduğu yerleşik fonksiyonlar ve nesne yönelimli sınıflar sayesinde tarih ve saat işlemlerini esnek bir yapıda çözümler. Bu rehberde, PHP’de tarih ve saat yönetimini temel fonksiyonlardan modern nesne yönelimli araçlara kadar ele alıyoruz.
Zaman Dilimi (Timezone) Yapılandırması
Tarih işlemlerine başlamadan önce sistemin hangi zaman diliminde çalıştığını belirlemek gerekir. Varsayılan olarak sunucunun yapılandırması kullanılır; ancak bu durum yerel kullanıcılar veya farklı coğrafyalardaki işlemler için hatalı zaman damgalarına yol açabilir. Özellikle siber güvenlik açısından log kayıtlarının tutarlı olması için zaman dilimi ayarı kritik önem taşır.
Zaman dilimini çalışma anında belirlemek için date_default_timezone_set() fonksiyonu kullanılır:
date_default_timezone_set('Europe/Istanbul');
echo date_default_timezone_get();
Bu örnekte ilk satır, uygulamanın çalışacağı saat dilimini İstanbul olarak belirler. İkinci satır ise geçerli zaman dilimini ekrana yazdırır. Kodun başında bu tanımı yapmak, ilerleyen satırlarda üretilecek tüm zaman verilerinin doğru referansla oluşturulmasını sağlar.
Temel Fonksiyon: date()
PHP’de en sık kullanılan tarih fonksiyonu date() fonksiyonudur. Bu fonksiyon, belirlenen bir biçim kuralına göre geçerli sistem saatini ya da verilen bir zaman damgasını okunabilir metin formatına dönüştürür.
Fonksiyonun temel prototipi iki parametre alır: biçim dizgisi (format string) ve isteğe bağlı zaman damgası (timestamp). İkinci parametre verilmezse geçerli an referans alınır.
echo date('Y-m-d H:i:s');
Yukarıdaki kod çalıştırıldığında 2024-05-18 14:30:15 benzeri bir çıktı üretir. Biçimlendirmede kullanılan temel karakterlerin anlamları şunlardır:
- Y: Dört basamaklı yıl bilgisi (örneğin 2024)
- m: İki basamaklı ay bilgisi, başında sıfır bulunur (01 ile 12 arası)
- d: İki basamaklı gün bilgisi, başında sıfır bulunur (01 ile 31 arası)
- H: 24 saatlik formatta iki basamaklı saat (00 ile 23 arası)
- i: İki basamaklı dakika bilgisi (00 ile 59 arası)
- s: İki basamaklı saniye bilgisi (00 ile 59 arası)
- l: Günün tam İngilizce adı (Monday, Tuesday gibi)
Unix Zaman Damgası ve time()
Unix zaman damgası (timestamp), 1 Ocak 1970 00:00:00 UTC tarihinden itibaren geçen toplam saniye sayısını temsil eder. Veritabanlarında zaman verisini tam sayı (integer) olarak depolamak ve matematiksel karşılaştırmalar yapmak için yaygın şekilde kullanılır.
Geçerli zaman damgasını elde etmek için time() fonksiyonu kullanılır:
$suan = time();
echo $suan;
$gelecek = $suan + (7 * 24 * 60 * 60);
echo date('Y-m-d', $gelecek);
Bu örnekte time() fonksiyonu mevcut saniyeyi üretir. Ardından bir haftalık sürenin saniye karşılığı (7 gün * 24 saat * 60 dakika * 60 saniye) eklenerek gelecekteki bir tarih hesaplanır ve date() fonksiyonuna ikinci parametre olarak verilerek biçimlendirilir.
Metinleri Tarihe Dönüştürme: strtotime()
Metin halindeki tarih ifadelerini Unix zaman damgasına dönüştürmek için strtotime() fonksiyonu kullanılır. Bu fonksiyon, insan tarafından okunabilir standart İngilizce tarih ifadelerini çözümleme yeteneğine sahiptir.
$yarin = strtotime('tomorrow');
echo date('Y-m-d', $yarin);
$gelecek_ay = strtotime('+1 month');
echo date('Y-m-d', $gelecek_ay);
$ozel_tarih = strtotime('2025-12-31 23:59:59');
echo $ozel_tarih;
İlk örnekte tomorrow ifadesi yarının başlangıç zamanını, ikinci örnekte +1 month ifadesi bir ay sonrasını hesaplar. Üçüncü örnekte ise belirli bir tarih metni doğrudan Unix zaman damgasına dönüştürülmüştür. Bu fonksiyon kullanıcı girdileriyle işlem yaparken esneklik sağlasa da beklenmeyen format hatalarını önlemek için girdi doğrulaması ile birlikte kullanılmalıdır.
Nesne Yönelimli Yaklaşım: DateTime Sınıfı
PHP 5.2 sürümünden bu yana sunulan DateTime sınıfı, prosedürel fonksiyonlara kıyasla daha modüler, hataya dayanıklı ve okunabilir bir yapı sunar. Büyük projelerde ve karmaşık tarih hesaplamalarında bu nesne yönelimli yaklaşım tercih edilir.
$tarih = new DateTime('now', new DateTimeZone('Europe/Istanbul'));
echo $tarih->format('Y-m-d H:i:s');
$tarih->modify('+10 days');
echo $tarih->format('Y-m-d H:i:s');
Bu yapıda DateTime sınıfından yeni bir nesne türetilir. İkinci parametre olarak DateTimeZone nesnesi verilerek nesne bazlı yerelleştirme yapılır. modify() metodu ise tarihi doğrudan manipüle etmeyi sağlar; örneğin mevcut tarihe 10 gün ekler.
İki Tarih Arasındaki Farkı Hesaplama
İki zaman noktası arasındaki farkı hesaplamak için diff() metodu kullanılır. Bu metod geriye bir DateInterval nesnesi döndürür.
$baslangic = new DateTime('2024-01-01');
$bitis = new DateTime('2024-06-15');
$fark = $baslangic->diff($bitis);
echo $fark->format('%y yıl, %m ay, %d gün');
echo $fark->days;
Bu kod bloğunda iki farklı tarih tanımlanmış ve aralarındaki fark hesaplanmıştır. format() metodu ile aradaki yıl, ay ve gün farkı ayrıştırılabilirken, days özelliği toplam gün farkını tam sayı olarak verir.
Tarih Doğrulama: checkdate()
Kullanıcı formlarından alınan gün, ay ve yıl bilgilerinin takvimsel olarak geçerli olup olmadığını sınamak mantıksal hataları ve güvenlik zafiyetlerini önler. Örneğin 31 Şubat veya artık yıl olmayan bir yılda 29 Şubat girilmesini engellemek gerekir.
$ay = 2;
$gun = 29;
$yil = 2023;
if (checkdate($ay, $gun, $yil)) {
echo 'Geçerli bir tarih.';
} else {
echo 'Geçersiz tarih!';
}
Fonksiyon sırasıyla ay, gün ve yıl parametrelerini alır ve boolean (true/false) değer döndürür. 2023 yılı artık yıl olmadığı için yukarıdaki kontrol geçersiz sonuç üretecektir.
Özet ve Sonraki Adımlar
PHP’de zaman yönetimi; date_default_timezone_set() ile doğru zaman diliminin belirlenmesi, date() ve time() gibi temel araçlarla basit formatlamaların yapılması ve karmaşık senaryolarda DateTime sınıfının kullanılması esasına dayanır.
Bir sonraki adımda, çok dilli uygulamalarda yerel ayarları destekleyen IntlDateFormatter sınıfını inceleyebilir ve veritabanı sistemlerindeki (örneğin MySQL TIMESTAMP ve DATETIME türleri) zaman saklama standartlarıyla PHP entegrasyonunu geliştirebilirsiniz.


Комментарии
Комментариев пока нет. Будьте первым.