RSS

PHP ile tarih ve saat

31 05 Ağustos 2013 ~ Musa Avcı — Orta

php-dateZaman hızla ilerliyor, bunu çalışmalarımızda sağlıklı ve fonksiyonel bir şekilde sunabilmek için PHP ile tarih ve saat ifadelerinden bahsedeceğim.

Tarih verilerini kullanmaya başlamadan önce yapmamız gereken bir takım ayarlar var. Bunlardan ilki doğru saat ve tarihe ulaşabilmek için hangi il, ülke ya da zaman diliminde olduğumuzu sunucuya belirtmek.

Bunun için “date_default_timezone_set” fonksiyonu ile bizim zaman dilimimizin belirtecini giriyoruz. Eğer farklı diyarların zaman dilimi belirteçlerini merak ediyorsanız şuradan bakabilirsiniz. Bu fonksiyonu uygulamanızın ayar dosyalarının içerisine, tarih fonksiyonlarını kullanmadan önce yazmalısınız.

date_default_timezone_set('Europe/Istanbul');

Saat kaç?

İstediğimiz zaman birimini ya da formatını alıp ekrana yazmak için date fonksiyonunu kullanıyoruz. Kullanımı gayet basit olan bu fonksiyonun içerisinde kullanacağımız biçim karakterlerini öğrenmek için öncelikle şuradaki tabloya bakabilirsiniz.

Ben burada sadece en çok kullanılanlarından bahsedeceğim:

Harf Açıklaması Örnek
d İki haneli şeklinde günü verir 27
m İki haneli şeklinde ayı verir 07
Y Dört haneli şeklinde yılı verir 2013
H İki haneli ve 24 saat formatında saati verir 19
i İki haneli şeklinde dakikayı verir 38
s İki haneli şeklinde saniyeyi verir 59
l (küçük L) Haftanın gününün ingilizce adını verir Monday
F Ayın ingilizce adını verir July

Yukarıdaki tabloya göre tarih ve zamanları ifade etmek için kullanacağımız biçimler şöyle;

// Örnek sonuç: 29.07.2013 12:13:00
echo date('d.m.Y H:i:s');

// Örnek sonuç: Saat: 12:13
echo 'Saat: ' . date('H:i');

// Örnek sonu: 29 July 2013 Monday
echo date('d F Y l');

Unix time

PHP tarih ve zaman ifadelerinde unix zaman damgasını kullanır. Unix timestamp en basit ifadeyle “1 Ocak 1970 00:00:00” tarihinden itibaren günümüze kadar geçen saniye sayısıdır.

Şuanın unix zaman damgasını almak için için time fonksiyonunu kullanacağız. Örneğin ben bu yazıyı hazırlarken ki zamana göre elde ettiğim değer aşağıdaki gibi;

echo time();
// 1375057836

Bu sayıyı önce saniyelere, dakikalara, saatlere ve günlere bölerek tam tarihe ulaşabilirsiniz, fakat date fonksiyonu bu işlemleri sizin için otomatik olarak yapıyor. Veritabanında tarihi saklamanın ucuz ve performanslı yollarından birisidir.

Zamanda yolculuk

Date fonksiyonuna ikinci parametre olarak unix zaman damgasında bir değer girerseniz o girdiğiniz değerin tarihini yazar. Örneğin yukarıda time fonksiyonu ile o anki zamanı aldık ve veritabanına yazdık diyelim, sonrasında tarihi göstermek istediğimizde date fonksiyonunun ikinci parametresine bu değeri yerleştirmemiz yeterli. Bu sefer bize anlık zamanı değil ona gönderdiğimiz değerin zamanını istediğimiz biçimde döndürecektir.

// 29.07.2013 03:30:36
echo date('d.m.Y H:i:s', 1375057836);

// 03:30:36
echo date('H:i:s', 1375057836);

Aynı mantıkta anlık bir dakika öncesini almak için şöyle bir ifade kullanabiliriz;

echo date('H:i:s', time() - 60);
// Ekranda 1 dakika önceki saat yazar

Zaman oluşturmak

Yukarıdaki örneklerde anın damgasını aldık ya da daha önce aldığımız zamanı yazdırdık. İstediğimiz bir zamanın unix zaman damgasını almak için mktime fonksiyonu geliyor.

Parametreleri sırasıyla şöyle; saat, dakika, saniye, ay, gün, yıl.

// 723033059
$timestamp = mktime(12, 20, 59, 11, 29, 1992);

Örneğin yukarıda 29 Kasım 1992 12:20:59 zamanının unix zaman damgasını elde ettik.

Zaman farkını hesaplamak

Unix zaman damgasının değeri saniye olduğu için iki değeri birbirinden çıkarttığımızda aralarındaki saniye farkına ulaşmış oluruz. Bu sayede iki farklı zaman arasında geçen süreyi hesaplayabiliriz.

Fakat elimize geçecek sonuç saniye olduğu için eğer 60’dan büyük ise 60’a bölüp dakikayı, eğer dakika sayısı da 60’dan büyükse saat farkı olduğunu ifade etmemiz gerekir.

Örneğin ben yine yukarıda oluşturduğum 1992 yılına ait zaman damgası ile günümüz arasındaki farkı bulduracağım.

$bugun = time();
$gecmis = mktime(12, 20, 59, 11, 29, 1992);

$fark = $bugun - $gecis;

echo 'Bugün: ' . $bugun;
echo 'Geçmiş: ' . $gecmis;
echo 'Saniye farkı: ' . $fark;

Benim bu çalışmayı denediğim ana göre aldığım çıktı şu şekilde;

Bugün: 1375484072
Geçmiş: 723032459
Saniye farkı: 652451613

İki zaman arasında 652451613 saniye geçmiş. Bu aslında benim şu zamana kadar yaşadığım saniye sayısı oluyor 😀 Gelin şimdi bunu zaman birimlerine bölelim ve daha anlaşılır bir biçime sokalım.

$dakika = $fark / 60;
$saniye_farki = floor($fark - (floor($dakika) * 60));

$saat = $dakika / 60;
$dakika_farki = floor($dakika - (floor($saat) * 60));

$gun = $saat / 24;
$saat_farki = floor($saat - (floor($gun) * 24));

$yil = floor($gun/365);
$gun_farki = floor($gun - (floor($yil) * 365));

echo $yil . ' yıl';
echo $gun_farki . ' gün';
echo $saat_farki . ' saat';
echo $dakika_farki . ' dakika';
echo $saniye_farki . ' saniye';

Bu işlemin sonucunda da şöyle bir sonuçla karşılaşıyoruz.

20 yıl
251 gün
12 saat
33 dakika
33 saniye

Yani doğduğum günden bugüne geçen zamanım buymuş.

Tarihi unix zaman damgasına çevirmek

Strtotime fonksiyonu ile yazılı tarihi unix zaman damgasına çevirebiliriz. Zaman ifadeleri haricinde bir takım İngilizce ifadeleri de kullanabiliyoruz.

echo strtotime('03.08.2013 03:23');
// Girilen tarihin unix zaman damgasını verir
// 1375489380

// Uygulanabilir diğer ifadeler
strtotime('2013-08-03');
strtotime('12:02:59');

// Şuanki zamana 1 gün ekler ve 1 saat çıkartır
strtotime('+1 day, -1 hour');

// Bir hafta öncesinin zaman damgasını verir
strtotime('-1 week');

// Enteresan bir örnek
echo date('d.m.Y H:i:s', strtotime('+5 years -2 weeks +3 months -5 minutes'));
// Şuanki zamana 5 yıl, 3 ay ekleyip 5 dakika ve 2 hafta çıkartır,
// elde ettiği zamanı belirttiğim formatta yazdırır.

Kullanıcılarınıza tarih girmelerini istediğinizde, girdikleri tarihi bu fonksiyondan geçirip veritabanınızda unix formatında saklayabilirsiniz. Fonksiyon eğer anlayamadığı bir biçim ile karşılaşırsa false dönecektir.

Tarihi Türkçe yazdırmak

Date fonksiyonu ayı ve haftanın günlerini İngilizce olarak veriyor. Bu nedenle tarihi Türkçe yazdırmak istediğimizde 2 farklı seçeneğimiz var. Birincisi eğer kodlarımızı çalıştıracağımız sunucuda Türkçe dil desteği var ise iki fonksiyonla olayı gerçekleştirebiliyoruz.

1. Yöntem (Eğer sistemde Türkçe dili tanımlıysa)

Önce setlocale fonksiyonu ile zaman işlemlerinde kullanacağımız dilimizi ifade ediyoruz. Sonrasında strftime fonksiyonu ile ifade ettiğimiz dilde zaman çıktısını alıyoruz. Strftime fonksiyonunun biçim karakterleri date fonksiyonunkilerinden farklı, yine tüm biçim karakterleri için şuraya bakabilirsiniz fakat ben bizim kullanacaklarımızı tanıtacağım.

Harf Açıklaması Örnek
%e Günü sıfır dolgusuz verir 27
%m İki haneli şeklinde ayı verir 07
%Y Dört haneli şeklinde yılı verir 2013
%H İki haneli ve 24 saat formatında saati verir 19
%M İki haneli şeklinde dakikayı verir 38
%S İki haneli şeklinde saniyeyi verir 59
%A Haftanın gününün adını verir Perşembe
%B Ayın adını verir Ocak
// Zaman için kullanacağımız dili ifade ediyoruz
setlocale(LC_TIME, 'tr_TR');

// Şu şekilde de olabilir
// setlocale(LC_TIME, 'tr_TR.UTF-8');

// İstediğimiz biçimde ve belirttiğimiz dilde tarihi yazdırıyoruz
echo strftime('%e %B %Y %A %H:%M:%S');
// Örnek Sonuç: 3 Ağustos 2013 Cumartesi 02:05:42

Eğer sunucunuz Türkçe’yi biliyorsa bu kadar kolay, fakat bilmiyorsa alternatif ve birazda manuel olarak diğer yöntemi uygulamalıyız.

2. Yöntem

Bu sefer date fonksiyonu ile kaçıncı ayda ve haftanın kaçıncı gününde olduğumuzu alıp, kendi tanımladığımız dizilerden ay ve gün isimlerini eşleştireceğiz. Yukarıda anlattıklarımın dışında; haftanın kaçıncı günü olduğu veren “N“, günü sıfır dolgusuz veren “j” karakterini kullanacağız.

$gunler = array(
	'Pazartesi',
	'Salı',
	'Çarşamba',
	'Perşembe',
	'Cuma',
	'Cumartesi',
	'Pazar'
);

$aylar = array(
	'Ocak',
	'Şubat',
	'Mart',
	'Nisan',
	'Mayıs',
	'Haziran',
	'Temmuz',
	'Ağustos',
	'Eylül',
	'Ekim',
	'Kasım',
	'Aralık'
);

$ay = $aylar[date('m') - 1];
$gun = $gunler[date('N') - 1];

echo date('j ') . $ay . date(' Y ') . $gun . date(' H:i:s');
// Örnek Sonuç: 3 Ağustos 2013 Cumartesi 02:19:18

Eğer dilerseniz bu dizini ve ifadeyi kullanarak kendinize bir fonksiyon hazırlayabilirsiniz.

Bu yazıda PHP’nin temel tarih ve saat fonksiyonlarından bahsetmeye çalıştım. Bir sonraki yazıda DateTime tarih ve saat sınıfından bahsetmeye çalışacağım.

Zamanı iyi değerlendirmeniz dileğiyle.

Bir sonraki serüvende görüşmek üzere esen kalın.

Etiketler:

Yazılanlar ilgini çektiyse, yenilerinden haberdar olmak için e-mail bültenine abone olabilirsin.

"PHP ile tarih ve saat" yazısı için 31 yorum yapılmış.

  1. Burak dedi ki:

    Hocam çok teşekkür ederim harika Bir yazı olmuş ellerinize sağlık
    Sitenizi sürekli takip ediyorum çok net ve anlaşılır makaleler var.

  2. Ebru dedi ki:

    teşekkürler bilgi için tam aradığım konuydu.

  3. Orhan dedi ki:

    konu güzel anlatılmış açıklayıcı arşive katalım saolasın

  4. Bulut Sunucu dedi ki:

    Merhaba öncelikle konu için teşekkürler.

    İki tarih aralığını hesaplayan fonksiyon sıkıntılı gibi direk bu hali ile çalıştırınca 45 yıl gibi bir hesaplama yapıyor 1992 den hesaplamasına rağmen

    güzel bir tarih aralığı hesaplama fonksiyonu lazım aslında gelişmiş bir çok kişinin işine yarayabilir.

  5. halil dedi ki:

    elinize sağlık güzel anlatmışsınız.

  6. Hasan YILDIZ dedi ki:

    Mysql veritabanında timestamp veri tipinde olan ve 2014-05-13 08:30:39 şeklinde gelen veriyi nasıl ekrana basmamız gerekiyor.

    İyi çalışmalar…

  7. Seyfulllah dedi ki:

    merhaba
    bi kaç sorum olacak. ilgilenirseniz sevinirim.
    veritabanında uyeler diye tablo uyetarih diye sütun var.
    uye kaydet işleminde formdan verileri aldım. veritabanına kaydettim . şimdi uyenin kayıt olduğu tarihi manuel değil ama ototmatik ekletelim diyelim..
    1- uyetarih sütununda date mi datetime mı timestamp mı kullanmalıyım. mesela gerektiğinde yıla gerektiğinde aya gerektiğinde güe göre listeleme yapılabilir. iki zaman dilimi arasında. mesela iki ay arasında. bu işlem için veritabanında sütun değeri ve kullanacağımız kod ne olmalı. çok fazla döküman okudum ama detay yok. tarih için date kullan yazıyolar ama nasıl yazacaz. el-cevap ?.
    date (“d.m.Y H:i:s”); kullanıp ekrana yazdırıyorum. sistem saatleri düzgün ama 6 saat geri yazdırıyor. lütfen cevap

    • Harun Doğan dedi ki:

      Ülkende kullanılan zaman dilimiyle alakalı olabilir sanırsam.
      date_default_timezone_set(‘Europe/Istanbul’); şeklinde <?php den sonra bunu yaz.Emin değilim ama sen yine de dene 🙂

  8. Serkan dedi ki:

    Tebrikler çok yardımcı oldunuz

  9. Şerif dedi ki:

    Çok işime yaradı, teşekkürler.

  10. bilgisayarix dedi ki:

    Merhaba, eric@ekittell.com tarafından hazırlanan ”
    VERY SIMPLE EVENTS LIST VERSION 1.0″ isimli basit bir php script buldum. Bu script editleyerek, türkçeleştirerek localhost ta kullanmak için hazırladım. Benim sorunum şudur ; girmiş olduğum kayıtları ana sayfada görüntülerken ay isimlerini ingilizce olarak gösteriyor. feb, apr, may gibi. localhost ta xammp kullanıyorum. Türkçe karakter sorununu düzeltmek için utf-8 ile iso-8859-1 kullanıp normal yazıları düzelttim. Sadece tarih bilgisindeki ay isimlerini düzeltemiyorum. Ne yaptıysam düzeltemedim sorunu. php.ini, mysql.ini httpd.conf gibi dosyalarda değişiklik yaptım. Nette bir çok sitedeki düzeltmeleri denedim ama bu sorunu düzeltemedim. Sorunu çözmeniz için script i indirip kurup denemeniz lazım. kullanmış olduğum xammp versiyonum XAMPP 1.7.3!. birlikte gelen PHP Version 5.3.1 ve mysql Client API version 5.1.41 kullanılmaktadır. Sorunu çözeni şimdiden tebrik ediyorum. php ve mysql konusunda uzman seviyesi olarak kabul ediyorum. Teşekkürler :))

  11. rahime dedi ki:

    iyi günler benim bi sorum olacaktı mesala elinizde bir ders programı var istiyorum ki bunu verdiğim iki tarih arasına yaysın ve toplamda hangi dersten kaç saat olduğunu söylesin mümkün mü nasıl ?

  12. Oyun Uzay dedi ki:

    Teşekkürler bilgiler için

  13. Ozan Aslan dedi ki:

    Merhaba.

    Güne göre bir sorgulama yatıracağım, yani bugün salı ise db’den salı günü değeri 1 olanları getir gibi.

    Gün eşleşmesini nasıl yapabilirim? Günün tarihini alınca bunu nasıl eşitleyeceğim bir türlü kavrayamadım?

    Bunu nasıl yapabilirim?

    Teşekkürler.

  14. plastik faras dedi ki:

    Paylaşım için Teşekkürler

  15. bakla zınnı dedi ki:

    Çok güzel hocam paylaştığınız için ve ayrıca anlatarak yaptığınız için ellerinize sağlık

  16. Emre ÇOBAN dedi ki:

    Yazı için teşekkürler.

    Düzeltme: $fark = $bugun – $gecis; => $fark = $bugun – $gecmis;

  17. Tolga dedi ki:

    Sizin gibiler yüzünden varya bu ülke büyüyecek ve gelişecek
    hem bu ne demek ya “Bu blogdaki tüm içerikleri kopyalayabilir, değiştirebilir, silebilir, kaynak göstermeden paylaşabilirsin” hayran kaldım yemin ediyorum.

  18. Burak Gürsoy dedi ki:

    Hocam strtotime(‘2015-08-09 +1 day’); diye bişey olabilir mi?

  19. selda dedi ki:

    çok açıklayıcı olmuş fakat
    echo date(‘j ‘) . $ay . date(‘ Y ‘) . $gun . date(‘ H:i:s’); kodu ekrana yazdırırken ben css kullanmak istiyorum bunu yapabilirmiyim yada hazırda bulunan bir div içine alabilirmiyim yazrdım ederseniz sevinirim

  20. Aziz Taşçı dedi ki:

    Eline sağlık çok iyi bir yazı olmuş anlaşılır olmuş. Çok sağolun.

  21. Muhammed dedi ki:

    merhaba
    bir ayi haftalara bölmek istiyorum. girilen gunun ayin kacinci haftasi oldugunu otomatik yazmasini isttiyorum nasil yapabilirim

    • Musa Avcı dedi ki:

      Aşağıdaki fonksiyon işinizi görecektir;

      function weekOfMonth($date) {
          // estract date parts
          list($y, $m, $d) = explode('-', date('Y-m-d', strtotime($date)));
      
          // current week, min 1
          $w = 1;
      
          // for each day since the start of the month
          for ($i = 1; $i &lt;= $d; ++$i) {
              // if that day was a monday and is not the first day of month
              if ($i &gt; 1 &amp;&amp; date('w', strtotime(&quot;$y-$m-$i&quot;)) == 1) {
                  // increment current week
                  ++$w;
              }
          }
      
          // now return
          return $w;
      }

      Fonksiyonun kaynağı aşağıda, fakat kaynakta haftanın ilk günü pazar olarak değerlendirildiği için ufak bir değişiklik yaptım. Pazarı ifade eden “0” olan kısmı pazartesiyi ifade edecek “1” ile değiştirdim.

      Kaynak: http://stackoverflow.com/a/32624169/910548

  22. Muhammed dedi ki:

    Sonuc -50 cikiyor
    Ben 19.01.2016 tarihini girince altta hemen 1. Ayin 3.hafta yazmasini istiyorum
    Tesekkurler

  23. Seorative dedi ki:

    Çok açıklayıcı bir makale olmuş. Tarih ve saat ile ilgili karşımızı çıkabilecek bütün soruların cevabı burada yer alıyor. Paylaşım için çok teşekkürler

  24. Ceyhun dedi ki:

    güzel paylaşım saat olarak değil de bazı sitelerde var kampanya yapacaz belli bir zaman 1 gün 3 saat 10 saniye gibi geri geri sayacak ürünün yanında bu nasıl olur ?

  25. Yusuf dedi ki:

    ini_set( ‘date.timezone’, ‘Europe/Istanbul’ );
    echo $tarihNormal = date(‘d.m.Y H:i’);

    yapıyorum ama 3 saat geri saat veriyor. Sunucu saati doğru. neden yapar?

  26. Muharrem dedi ki:

    çooook teşekkür ederim. çok denedim, hazırları da olmadı. php versiyon sorunu galiba. ama iyi iş gördü.

  27. Ahmet S dedi ki:

    Süper bir yazı olmuş sağolun

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir