PHP ile tarih ve saat
Zaman 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.
Yazılanlar ilgini çektiyse, yenilerinden haberdar olmak için e-mail bültenine abone olabilirsin.
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.
teşekkürler bilgi için tam aradığım konuydu.
konu güzel anlatılmış açıklayıcı arşive katalım saolasın
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.
elinize sağlık güzel anlatmışsınız.
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…
şeklinde dilediğiniz formatta yazabilirsiniz
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
Ü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 🙂
Tebrikler çok yardımcı oldunuz
Çok işime yaradı, teşekkürler.
Merhaba, [email protected] 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 :))
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 ?
Teşekkürler bilgiler için
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.
Paylaşım için Teşekkürler
Çok güzel hocam paylaştığınız için ve ayrıca anlatarak yaptığınız için ellerinize sağlık
Yazı için teşekkürler.
—
Düzeltme: $fark = $bugun – $gecis; => $fark = $bugun – $gecmis;
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.
Hocam strtotime(‘2015-08-09 +1 day’); diye bişey olabilir mi?
ç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
Eline sağlık çok iyi bir yazı olmuş anlaşılır olmuş. Çok sağolun.
merhaba
bir ayi haftalara bölmek istiyorum. girilen gunun ayin kacinci haftasi oldugunu otomatik yazmasini isttiyorum nasil yapabilirim
Aşağıdaki fonksiyon işinizi görecektir;
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
Sonuc -50 cikiyor
Ben 19.01.2016 tarihini girince altta hemen 1. Ayin 3.hafta yazmasini istiyorum
Tesekkurler
Ç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
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 ?
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?
şu fonksiyonu deneyin; http://php.net/manual/tr/function.date-default-timezone-set.php
çooook teşekkür ederim. çok denedim, hazırları da olmadı. php versiyon sorunu galiba. ama iyi iş gördü.
Süper bir yazı olmuş sağolun
Php ile tarih saat araması yaptığımda hep bu siteyi buluyor ve içeriğinde de aradığımızı buluyoruz. Emeğinize sağlık
faydalı bir makale olmus ellerinize sağlık
Yazi icin tesekkurler.peki iki tarih arasindaki farkı bulurken saatin geri yada ileri alınması da buna dahil mi?hesaplama yaparken bunu dikkate aldigini sanmiyorum.