PHP Date and time transactions

Php Tarih ve Saat işlemleri

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:

  • d     İki haneli şeklinde günü verir
  • m    İki haneli şeklinde ayı verir
  • Y     Dört haneli şeklinde yılı verir
  • H     İki haneli ve 24 saat formatında saati verir
  • i      İki haneli şeklinde dakikayı verir
  • s     İki haneli şeklinde saniyeyi verir
  • l      (küçük L) Haftanın gününün ingilizce adını verir
  • F     Ayın ingilizce adını verir

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.

  • %e    Günü sıfır dolgusuz verir
  • %m    İki haneli şeklinde ayı verir
  • %Y    Dört haneli şeklinde yılı verir
  • %H    İki haneli ve 24 saat formatında saati verir
  • %M    İki haneli şeklinde dakikayı verir
  • %S    İki haneli şeklinde saniyeyi verir 
  • %A    Haftanın gününün adını verir
  • %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.