PHP Tarih - Saat İşlemleri

PHP’de tarih-zaman bilgisini almak için getdate(), biçimlendirmek için date() / DateTime kullanılır. Dil (Türkçe ay-gün adları) için en doğru yöntem IntlDateFormatter’dır.

Püf Noktalar
  • Timezone ayarlamazsan saat kaymış görünebilir: date_default_timezone_set('Europe/Istanbul')
  • date() dili Türkçe olmaz; date('F') genelde “January” döner. Türkçe için IntlDateFormatter kullan.
  • Kısa tag (<?) bazı sunucularda kapalı olur. En güvenlisi <?php.

Hızlı Örnekler

En çok kullanılan birkaç tarih-saat formatı:

Örnek: date() formatları
<?php
date_default_timezone_set('Europe/Istanbul');

echo "Log: " . date('Y-m-d H:i:s') . PHP_EOL;     // 2026-01-04 16:30:00
echo "TR:  " . date('d.m.Y H:i') . PHP_EOL;      // 04.01.2026 16:30
echo "ISO: " . date('c') . PHP_EOL;              // 2026-01-04T16:30:00+03:00
echo "RFC: " . date('r') . PHP_EOL;              // Sun, 04 Jan 2026 16:30:00 +0300
?>
Canlı Çıktı
Sunucunun ayarlı saatine göre anlık üretim:
Log: 2026-04-16 12:06:25
TR: 16.04.2026 12:06
ISO: 2026-04-16T12:06:25+03:00
RFC: Thu, 16 Apr 2026 12:06:25 +0300

date() Biçimlendirme Parametreleri

Aşağıdaki tablo sık kullanılan parametreleri özetler. (Not: F, l gibi ay/gün adları çoğu sunucuda İngilizce döner.)

Parametre Açıklama Örnek
aam/pm (küçük harf)pm
AAM/PM (büyük harf)PM
dGün (2 hane, başa 0): 01-3104
jGün (0’sız): 1-314
DGün kısa adı (genelde İngilizce): Mon, Tue…Sun
l(küçük L) Gün uzun adı (genelde İngilizce): Sunday…Sunday
mAy (2 hane): 01-1201
nAy (0’sız): 1-121
MAy kısa adı (genelde İngilizce): Jan, Feb…Jan
FAy uzun adı (genelde İngilizce): January…January
YYıl (4 hane)2026
yYıl (2 hane)26
HSaat (24’lük, 2 hane): 00-2316
GSaat (24’lük, 0’sız): 0-2316
hSaat (12’lik, 2 hane): 01-1204
gSaat (12’lik, 0’sız): 1-124
iDakika: 00-5905
sSaniye: 00-5909
tAyın gün sayısı: 28-3131
LArtık yıl mı? (1/0)0
zYılın gün sayısı: 0-3653
wHaftanın günü: 0=Pazar … 6=Cumartesi0
NISO haftanın günü: 1=Pazartesi … 7=Pazar7
WISO hafta numarası01
oISO yıl (W ile birlikte)2026
UUnix timestamp (saniye)1776330385
cISO 86012026-04-16T12:06:25+03:00
rRFC 2822Thu, 16 Apr 2026 12:06:25 +0300
eTimezone adıEurope/Istanbul
PUTC offset (+03:00)+03:00

Örnek: date() ile biçimlendirme

Senin örnekleri koruduk, yanına pratik bir format daha ekledik:

Örnek: 3 farklı format
<?php
date_default_timezone_set('Europe/Istanbul');

echo "1) " . date("l dS of F Y h:i:s A") . "<br>";
echo "2) " . date("l, d F Y g:i:s") . "<br>";
echo "3) " . date("d.m.Y H:i:s") . "<br>"; // TR görünüm (ay/gün adı yok)
?>
Not
1) ve 2) formatındaki l ve F değerleri çoğu sunucuda İngilizce gelir. Türkçe ay/gün adı istiyorsan aşağıdaki “Türkçe çıktı” bölümünü kullan.
Canlı Çıktı
1) Thursday 16th 2026f April 2026 12:06:25 PM
2) Thursday, 16 April 2026 12:06:25
3) 16.04.2026 12:06:25

Tarih bilgisini dizi olarak almak: getdate()

getdate() mevcut zamanı (veya verdiğin timestamp’i) dizi şeklinde döndürür.

Örnek: getdate()
<?php
$bilgi = getdate(); // şimdi

echo $bilgi['year'] . "-" . $bilgi['mon'] . "-" . $bilgi['mday'] . "<br>";
echo $bilgi['hours'] . ":" . $bilgi['minutes'] . ":" . $bilgi['seconds'] . "<br>";
echo "Haftanın günü (0=Pazar): " . $bilgi['wday'];
?>

Timestamp ve dönüşümler: time() / strtotime()

time() şimdi’nin Unix timestamp’ini verir. strtotime() ise metinden tarih üretir (ör: +7 days, next monday).

Örnek: time() + strtotime()
<?php
$simdi = time();

echo "Timestamp: " . $simdi . "<br>";
echo "Şimdi: " . date('Y-m-d H:i:s', $simdi) . "<br>";

echo "+7 gün: " . date('Y-m-d', strtotime('+7 days')) . "<br>";
echo "Gelecek Pazartesi: " . date('Y-m-d', strtotime('next monday')) . "<br>";
echo "Dün: " . date('Y-m-d H:i', strtotime('yesterday')) . "<br>";
?>
Dikkat
strtotime() yorumlamayı timezone’a göre yapar. Bu yüzden timezone ayarı (Europe/Istanbul) önemlidir.

Modern kullanım: DateTime ve DateTimeImmutable

Tarih üzerinde işlem yapacaksan (gün ekle, ay çıkar, karşılaştır, timezone çevir) en esnek yöntem budur.

Örnek: DateTime ve modify()
<?php
$tz = new DateTimeZone('Europe/Istanbul');

$dt = new DateTime('now', $tz);
echo "Şimdi: " . $dt->format('Y-m-d H:i:s') . "<br>";

$dt->modify('+10 days');
echo "+10 gün: " . $dt->format('Y-m-d H:i:s') . "<br>";

// Immutable örneği (orijinal değişmez)
$im = new DateTimeImmutable('2026-01-04 10:00:00', $tz);
$im2 = $im->modify('+3 hours');

echo "Immutable ilk: " . $im->format('Y-m-d H:i:s') . "<br>";
echo "Immutable yeni: " . $im2->format('Y-m-d H:i:s') . "<br>";
?>

Türkçe gün/ay adı ile çıktı: IntlDateFormatter

Ay/gün adlarını gerçekten Türkçe basmak istiyorsan en doğru yöntem budur. (Sunucuda intl eklentisi aktif olmalı.)

Örnek: tr_TR ile Türkçe format
<?php
date_default_timezone_set('Europe/Istanbul');

$dt = new DateTime('now', new DateTimeZone('Europe/Istanbul'));

if (class_exists('IntlDateFormatter')) {
    $fmt = new IntlDateFormatter(
        'tr_TR',
        IntlDateFormatter::FULL,
        IntlDateFormatter::MEDIUM,
        'Europe/Istanbul'
    );
    echo $fmt->format($dt);
} else {
    echo "IntlDateFormatter yok. Sunucuda intl eklentisini etkinleştirin.";
}
?>
Canlı Çıktı
16 Nisan 2026 Perşembe 12:06:25

Bonus: İki tarih arasındaki fark (DateInterval)

İki tarih arasındaki gün/saat farkını hesaplamak için:

Örnek: diff()
<?php
$tz = new DateTimeZone('Europe/Istanbul');
$a = new DateTime('2026-01-01 10:00:00', $tz);
$b = new DateTime('2026-01-04 16:30:00', $tz);

$diff = $a->diff($b);

echo "Fark: " . $diff->days . " gün, " . $diff->h . " saat, " . $diff->i . " dk";
?>