- Konu sahibi
- #1
PHP’de tarih ve saati biçimlendirmek için en pratik yöntem
Önce tarih nesnesini oluşturun, ardından istediğiniz biçimi
Bu örneğin çıktısı şöyledir:
Buradaki
Aşağıdaki karakterler, günlük PHP uygulamalarında en çok kullanılan tarih ve saat parçalarını verir:
Örneğin 12 saatlik gösterim ve öğleden önce/sonra bilgisi için şu biçimi kullanabilirsiniz:
Çıktı
Format dizgesindeki harflerin çoğu özel anlam taşır. Sabit bir metin eklemek istediğinizde metni tek tırnak içine alabilir veya özel karakterleri ters eğik çizgiyle kaçırabilirsiniz:
Beklenen çıktı şöyledir:
Burada
Bu yöntemin çalışması için PHP kurulumunda
Veri tabanından veya başka bir sistemden Unix zaman damgası geliyorsa bu sayı, 1 Ocak 1970 UTC’den itibaren geçen saniyeyi ifade eder. Sayıyı doğrudan
Ancak
Tarih biçimlendirmede en sık karşılaşılan hata, doğru tarih bilgisinin yanlış saat diliminde gösterilmesidir. Kullanıcıya gösterilen değer için uygulamanın hedef saat dilimini açıkça seçin:
Veri tabanında tarih saklarken çoğu uygulama UTC kullanır, kullanıcıya gösterirken ise kullanıcının veya uygulamanın saat dilimine dönüştürür. Bu iki işlemi birbirine karıştırmayın: saklama biçimi ile gösterim biçimi aynı şey değildir. Ayrıca yalnızca ekranda görünen biçime bakarak verinin doğru saat diliminde saklandığı kanıtlanamaz; kaynak değer ve kullanılan saat dilimi de kontrol edilmelidir.
Veri tabanından gelen değer
Çıktı
Burada beklenen sonuç, UTC değerinin İstanbul saatine çevrilmiş gösterimidir. Saat beklenenden farklıysa önce veri tabanındaki değerin hangi saat diliminde saklandığını ve kodda hangi
Kullanıcıdan gelen tarih metnini doğrudan
Geçerli bir girdi için örneğin
DateTimeImmutable nesnesinin format() metodunu kullanmaktır. Elinizde Unix zaman damgası varsa date() de kullanılabilir; ancak saat dilimini açıkça yönetmeniz gereken uygulamalarda DateTimeImmutable ve DateTimeZone birlikte daha güvenlidir. Biçimlendirme işlemi tarihi değiştirmez, yalnızca ekrana veya çıktıya hangi sırada ve biçimde yazılacağını belirler.DateTimeImmutable ile tarih ve saat biçimlendirme
Önce tarih nesnesini oluşturun, ardından istediğiniz biçimi
format() içine yazın:
PHP:
<?php
$tarih = new DateTimeImmutable('2026-10-25 14:30:45', new DateTimeZone('Europe/Istanbul'));
echo $tarih->format('d.m.Y H:i:s');
Bu örneğin çıktısı şöyledir:
Kod:
25.10.2026 14:30:45
Buradaki
d iki haneli gün, m iki haneli ay, Y dört haneli yıl, H 24 saatlik saat, i dakika ve s saniye anlamına gelir. Biçim karakterleri büyük-küçük harfe duyarlıdır. Örneğin m ayı, M ise İngilizce kısa ay adını temsil eder.Sık kullanılan biçim karakterleri
Aşağıdaki karakterler, günlük PHP uygulamalarında en çok kullanılan tarih ve saat parçalarını verir:
| Biçim | Anlamı | Örnek çıktı |
|---|---|---|
| d | İki haneli gün | 05 |
| j | Baştaki sıfır olmadan gün | 5 |
| m | İki haneli ay | 10 |
| n | Baştaki sıfır olmadan ay | 10 |
| Y | Dört haneli yıl | 2026 |
| y | İki haneli yıl | 26 |
| H | 24 saatlik saat | 14 |
| h | 12 saatlik saat | 02 |
| i | Dakika | 30 |
| s | Saniye | 45 |
| a | Küçük harfle öğleden önce/sonra göstergesi | pm |
| A | Büyük harfle öğleden önce/sonra göstergesi | PM |
PHP:
<?php
$tarih = new DateTimeImmutable('2026-10-25 14:30:45');
echo $tarih->format('d/m/Y h:i A');
Çıktı
25/10/2026 02:30 PM olur. Buradaki h yalnızca saati 12 saatlik biçime çevirir; A ise bunun öğleden sonra olduğunu gösterir. H kullanırsanız aynı saat 14:30 olarak yazılır.Metin eklemek ve özel karakterleri göstermek
Format dizgesindeki harflerin çoğu özel anlam taşır. Sabit bir metin eklemek istediğinizde metni tek tırnak içine alabilir veya özel karakterleri ters eğik çizgiyle kaçırabilirsiniz:
PHP:
<?php
$tarih = new DateTimeImmutable('2026-10-25 14:30:45');
echo $tarih->format('d.m.Y arihinde saat H:i');
Beklenen çıktı şöyledir:
Kod:
25.10.2026 tarihinde saat 14:30
Burada
\t içindeki t harfi tarih biçimlendirme karakteri olarak yorumlanmaz ve normal metin olarak yazdırılır. Birden fazla sabit metin kullanacaksanız biçim dizgesini dikkatli hazırlayın; aksi hâlde harfler tarih parçalarına dönüştürülebilir.Türkçe ay ve gün adlarını göstermek
format() içindeki l, D, F ve M karakterleri gün veya ay adlarını yerleşik İngilizce adlarla üretebilir. Bu değerleri Türkçe göstermek için yalnızca format() kullanmak yeterli değildir. Uygulamanızın yerelleştirme yaklaşımına göre çeviri tablosu kullanabilir veya IntlDateFormatter sınıfından yararlanabilirsiniz.
PHP:
<?php
$tarih = new DateTimeImmutable('2026-10-25 14:30:45', new DateTimeZone('Europe/Istanbul'));
$formatter = new IntlDateFormatter(
'tr_TR',
IntlDateFormatter::LONG,
IntlDateFormatter::SHORT,
'Europe/Istanbul'
);
echo $formatter->format($tarih);
Bu yöntemin çalışması için PHP kurulumunda
intl uzantısının etkin olması gerekir. format() sayısal biçimler için yeterliyken, IntlDateFormatter dil ve bölgeye göre ay, gün ve saat gösterimini yerelleştirmek için uygundur. Sunucuda intl yoksa kod çalışırken sınıf bulunamadığına dair hata alabilirsiniz; bu durumda uzantıyı etkinleştirmek veya uygulama içinde açık bir Türkçe karşılık tablosu kullanmak gerekir.Unix zaman damgasını biçimlendirme
Veri tabanından veya başka bir sistemden Unix zaman damgası geliyorsa bu sayı, 1 Ocak 1970 UTC’den itibaren geçen saniyeyi ifade eder. Sayıyı doğrudan
date() ile biçimlendirebilirsiniz:
PHP:
<?php
$zamanDamgasi = 1792938645;
echo date('d.m.Y H:i:s', $zamanDamgasi);
Ancak
date() çıktıyı PHP işleminin varsayılan saat dilimine göre üretir. Uygulamanın saat dilimi sunucudan sunucuya değişebileceği için saat dilimini açıkça belirtmek istiyorsanız zaman damgasını DateTimeImmutable::createFromFormat() ile nesneye dönüştürün:
PHP:
<?php
$zamanDamgasi = 1792938645;
$tarih = (new DateTimeImmutable('@' . $zamanDamgasi))
->setTimezone(new DateTimeZone('Europe/Istanbul'));
echo $tarih->format('d.m.Y H:i:s');
@ ile oluşturulan nesne başlangıçta UTC tabanlıdır. setTimezone() ise aynı anı İstanbul saat diliminde gösterir. Saat dilimini değiştirmek zaman damgasını değiştirmez; yalnızca ekranda görülen saat değişebilir.Saat dilimini doğru seçme
Tarih biçimlendirmede en sık karşılaşılan hata, doğru tarih bilgisinin yanlış saat diliminde gösterilmesidir. Kullanıcıya gösterilen değer için uygulamanın hedef saat dilimini açıkça seçin:
PHP:
<?php
$tarih = new DateTimeImmutable('now', new DateTimeZone('Europe/Istanbul'));
echo $tarih->format('d.m.Y H:i:s');
Veri tabanında tarih saklarken çoğu uygulama UTC kullanır, kullanıcıya gösterirken ise kullanıcının veya uygulamanın saat dilimine dönüştürür. Bu iki işlemi birbirine karıştırmayın: saklama biçimi ile gösterim biçimi aynı şey değildir. Ayrıca yalnızca ekranda görünen biçime bakarak verinin doğru saat diliminde saklandığı kanıtlanamaz; kaynak değer ve kullanılan saat dilimi de kontrol edilmelidir.
Veri tabanından gelen tarihi biçimlendirme
Veri tabanından gelen değer
2026-10-25 14:30:45 gibi bir metinse, doğrudan metin üzerinde karakter değiştirmek yerine tarihi nesneye dönüştürüp biçimlendirin:
PHP:
<?php
$veritabaniTarihi = '2026-10-25 14:30:45';
$tarih = new DateTimeImmutable(
$veritabaniTarihi,
new DateTimeZone('Europe/Istanbul')
);
echo $tarih->format('d.m.Y H:i');
Çıktı
25.10.2026 14:30 olur. Veri tabanındaki değer UTC olarak tutuluyorsa nesneyi UTC saat dilimiyle oluşturup daha sonra kullanıcıya gösterilecek saat dilimine dönüştürün:
PHP:
<?php
$veritabaniTarihi = '2026-10-25 11:30:00';
$tarih = new DateTimeImmutable(
$veritabaniTarihi,
new DateTimeZone('UTC')
);
echo $tarih
->setTimezone(new DateTimeZone('Europe/Istanbul'))
->format('d.m.Y H:i');
Burada beklenen sonuç, UTC değerinin İstanbul saatine çevrilmiş gösterimidir. Saat beklenenden farklıysa önce veri tabanındaki değerin hangi saat diliminde saklandığını ve kodda hangi
DateTimeZone değerinin kullanıldığını karşılaştırın. Yalnızca çıktı biçimini değiştirmek saat farkını düzeltmez.Kullanıcı girdisini biçimlendirmeden önce doğrulama
Kullanıcıdan gelen tarih metnini doğrudan
new DateTimeImmutable() içine vermek bazı belirsiz biçimlerde beklenmeyen yorumlara yol açabilir. Beklenen biçimi sabitleyip createFromFormat() ve getLastErrors() ile doğrulayın:
PHP:
<?php
$girdi = '25.10.2026';
$tarih = DateTimeImmutable::createFromFormat(
'!d.m.Y',
$girdi,
new DateTimeZone('Europe/Istanbul')
);
$hatalar = DateTimeImmutable::getLastErrors();
if ($tarih === false || ($hatalar !== false && ($hatalar['warning_count'] > 0 || $hatalar['error_count'] > 0))) {
echo 'Geçersiz tarih';
} else {
echo $tarih->format('Y-m-d');
}
Geçerli bir girdi için örneğin
2026-10-25 çıktısını alırsınız. ! işareti, belirtilmeyen saat parçalarının başlangıç değerleriyle kurulmasını sağlar. Girdi hatalıysa biçimlendirme yapıp geçerliymiş gibi kaydetmek yerine kullanıcıya beklenen biçimi bildirin. Tarihin biçiminin doğru olması, takvim açısından her iş kuralının geçerli olduğu anlamına gelmez; örneğin bir rezervasyon tarihi ayrıca geçmişte olamaz veya başlangıç tarihinden önce olamaz gibi kurallarla kontrol edilmelidir.