‘tarih-saat fonksiyonları’ etiketli yazýlar

For english: Date & Time Difference in PHP

İki tarih arasındaki farkı hesaplamak için PHP’de date_diff diye bir fonksiyon bulunmakta ama ne yazık ki bu fonksiyon PHP’nin sadece 5.3 ve sonraki versiyonlarında çalışıyor. Dolayısıyla pek çok kiÅŸi için tarih-saat farkı hesaplayan bir fonksiyona ihtiyaç var. Bu sayfada bu iÅŸi yapan bir fonksiyon bulacaksınız. Aradığınız sadece Türkçe tarih & saat göstermek ise ÅŸu yazıya bakınız: PHP ile Türkçe Tarih Gösterimi-Çevrimi

Kullanım

Fonksiyon 3 adet değişken alıyor. Bunlardan sadece birincisi zorunlu.
dateDiff($d1[, $d2=null [, $format="*"]);

İlk iki parametre olarak farkı alınacak tarih ve/veya saatleri giriyorsunuz. Tarih formatı olarak Unix zaman damgası veya ‘strtotime‘ fonksiyonunun kabul ettiÄŸi herhangi bir deÄŸer kullanılabilir. Dolayısıyla tarih girmek için ‘time()‘ fonksiyonun ya da acayip bir format kullanmıyorsanız MySQL verilerini doÄŸrudan kullanabilirsiniz. ‘strtotime‘ fonksiyonunu kabul ettiÄŸi deÄŸerler ile ilgili php.net strtotime sayfasına bakabilirsiniz. Girilen zamanların hangisinin büyük olduÄŸu önemli deÄŸil. Yani tarihFarki(’12-03-2009′, ‘01-01-2010′) ve tarihFarki(’01-01-2010′, ‘12-03-2009′) size aynı sonuçları getirecektir. Son parametre olan $format sonucun hangi ÅŸekilde döndürüleceÄŸini belirler. $format olarak “saniye”, “dakika”, “saat”, “gun”, “hafta”, “ay”, “yil” veya “*” deÄŸerlerinden birisini girebilirsiniz. “*” dışındaki seçeneklerde fonksiyon size belirtilen formatta bir sayı döndürecekir. Yani tarihFarki(’2010-01-02′, ‘2010-01-01′, ‘gun’) yazarsanız alacağınız sonuç ‘1′, tarihFarki(’2010-01-02′, ‘2010-01-01′, ‘dakika’) yazarsanız ‘86400′ (bir gündeki dakika sayısı) olur. EÄŸer $format olarak “*” girerseniz ya da bu alanı hiç kullanmazsanız fonksiyon yukarıda geçen tüm deÄŸerleri içeren bir dizi döndürür.

Örnekler

echo "Åžu an:".date("r",time())."<br>";
echo "1: ".tarihFarki("20090401040302", time(), "ay")." ay<br>";
echo "2: ".tarihFarki(time(), "2009-07-23 04:00:00", "saat")." saat<br>";
echo "3: ".tarihFarki("-3 day", "2009-07-23 04:00:00", "gun")." gun<br>";
echo "4: ".tarihFarki("2008-06-23", "2009-07-23", "yil")." yıl<br>";
$t=tarihFarki("2008-06-23", "2009-07-23");
echo "5: ";
print_r($t);
echo "<br>";

Kod

/**
 * Iki tarih arasindaki farki bulur.<br>
 * <strong>kullanim:</strong> dateDiff($d1[, $d2=null [, $format="*"]);<br>
 * <strong>ornek:</strong><br>
 * echo "ÅŸu an:".date("r",time())."<br>";
 * echo "1: ".tarihFarki("20090401040302", time(), "ay")." ay<br>";
 * echo "2: ".tarihFarki(time(), "2009-07-23 04:00:00", "saat")." saat<br>";
 * echo "3: ".tarihFarki("-3 day", "2009-07-23 04:00:00", "gun")." gun<br>";
 * echo "4: ".tarihFarki("2008-06-23", "2009-07-23", "yil")." yıl<br>";
 * $t=tarihFarki("2008-06-23", "2009-07-23");
 * echo "5: "; print_r($t);
 *
 * @param mixed $d1     ilk tarih. unix zaman damgasi ya da strtome 
 *                      fonsksiyonunun kabul ettigi herhangi bir deger olabilir. 
 *                      ornek: '2009-05-23', '2009-05-23 12:10:04', '-2 day',
 *                      '23-05-2009 12:23', '20090523121004'
 * @param mixed $d2     ikinci tarih. ilkiyle ayni ozellikleri tasir. eger 
 *                      girilmez ya da bos bir deger olarak girilirse o anki 
 *                      tarih olarak alinir. bu iki tarih arasinda 
 *                      hangisinin buyuk hangisinin kucuk oldugu onemli degildir.
 *                      ikisi de ayni sonuc verir.
 * @param str $format   "saniye", "dakika", "saat", "gun", "hafta", "ay", 
 *                      "gun", "*".
 *                      eger girilmez ya da "*" olarak girilirse yukaridaki 
 *                      butun degerleri iceren bir dizi dondurur. belirtilen 
 *                      diger degerlerden birisi girilirse bu tipte bir sayi 
 *                      dondurur.
 * @return mixed        sayi ya da dizi tipinde tarihler arasindaki farki 
 *                      dondurur. dizinin icinde bulunan  degiskenler 
 *                      sunlardir: "saniye", "dakika", "saat", "gun", "hafta", 
 *                      "ay", "gun" olacaktir.
 */
function tarihFarki($d1, $d2=null, $format="*"){
    if($d2==null){
        $d2=$d1;
        $d1=time();
    }
 
    if(!is_int($d1)) $d1=strtotime($d1);
    if(!is_int($d2)) $d2=strtotime($d2);
    $d=abs($d1-$d2);
 
    $format=strtolower($format);
    if(empty($format)) $format="*";
 
    $result = array();
 
    if($format=="*" || $format=="gun")    $result["gun"]   = floor($d/(60*60*24));
    if($format=="*" || $format=="ay")     $result["ay"] = floor($d/(60*60*24*30));
    if($format=="*" || $format=="yil")    $result["yil"]  = floor($d/(60*60*24*365));
    if($format=="*" || $format=="hafta")  $result["hafta"]  = floor($d/(60*60*24*7));
    if($format=="*" || $format=="saat")   $result["saat"]  = floor($d/(60*60));
    if($format=="*" || $format=="dakika") $result["dakika"]= floor($d/60);
 
    if($format!="*") return $result[$format];
    else return $result;
}

Kolaylıkların dili PHP ile tarih formatlamak gerçekten kolay bir iÅŸ ama sadece ingilizce siteler için. İngilizce bir sitede tarih göstermek için tek ihtiyacınız ‘date‘ fonksiyonu. İlk parametre olarak gireceÄŸiniz belirli karakterlerle tarihi istediÄŸiniz gibi gösterebilirsiniz. Mesela ‘January 12, 2009‘ yazdırmak için ‘echo date(”F j, Y”)‘ yazmanız yeterli olacaktır.

Türkçe Tarih & Saat Fonksiyonu

Tarih ve saat gösterimini en basit ÅŸekilde halledebilmeniz için aÅŸağıdaki göreceÄŸiniz fonksiyonu kullanabilirsiniz. Fonksiyonun çalışma prensibi çok basit: date fonksiyonunu çağırıp aldığı çıktıdaki ingilizce kelimeleri türkçeye çeviriyor. Fonksiyonun dışında kalan diziler de bu çevrimler için zaten. DoÄŸrudan date fonksiyonu kullanıldığı için aldığı parametreler temelde date ile aynı. Sadece iÅŸleri biraz daha kolaylaÅŸtırmak için bu parametrelerin yeteneklerini arttırdım. Şöyle ki: tarih formatının belirlendiÄŸi ilk parametrede ay, gün, yıl gibi türkçe kelimeler; gösterilecek tarihin belirlendiÄŸi ikinci parametrede ise tek bir tane yerine çok daha çeÅŸitli formatlarda tarihler kullabiliyorsunuz. Basitçe örneklersek, date(”d F Y”) fonksiyonunu tarih(”d F Y”) ÅŸeklinde yazabileceÄŸiniz gibi tarih(”gun ay yil”) ÅŸeklinde de yazabilirsiniz (çıktısı ‘17 Mayıs 2009′ gibi birÅŸey olacaktır).

Tanımlama:

tarih($format, [$zaman]);
$zaman ile belirtilen zamanı ilk parametrede belirtilen formatta biçimlendirir. $zaman parametresi girilmemişse çalışma zamanındaki zaman kullanılır.

Parametreler:

$format

Biçilendirilecek tarihin formatı. String içerisine yazılan format bilgilerinden oluÅŸur (”d-F-Y” gibi). date fonksiyonunda kullanılan seçeneklerin hepsi bu deÄŸiÅŸken için de geçerlidir. php.net:date fonksiyonu adresinde detaylı seçenekleri görebilirsiniz. Bu sayfada belirtilen seçeneklerin yanı sıra aÅŸağıda belirtilen türkçe deÄŸerler de kullanılabilir.

Biçim Açıklama Örnek sonuç
gun Ay günlerinin sıfır dolgulu iki haneli gösterimi 01′den 31′e
kisagun Ay günlerinin sıfır dolgusuz gösterimi 1′den 31′e
hgun Hafta günlerinin tam metinsel gösterimi Pazar’dan Cumartesi’ye
hgunkisa Ay günlerinin iki harfli metinsel gösterimi Pzt’den Paz’a
ay Ayın tam metinsel gösterimi, Ocak ya da Mart gibi Ocak’tan Aralık’a
kisaay Ayın üç karakterli, metinsel kısa gösterimi Oca’dan Ara’ya kadar
aysayi Ayın sıfır dolgulu sayısal gösterimi 01′den 12′ye
kisaaysayi Ayın sıfır dolgusuz sayısal gösterimi 1′den 12′ye kadar
yil Yılın 4 haneli sayısal, tam gösterimi 1999 ya da 2003 gibi
kisayil Yılın iki haneli gösterimi 99 ya da 03 gibi
saat Saatin, 24-saatlik sıfır dolgulu gösterimi 00′dan 23′e
kisasaat Saatin, 12-saatlik sıfır dolgulu gösterimi 01′den 12′ye
dakika Sıfır dolgulu dakika gösterimi 00 ile 59 arasında
saniye Sıfır dolgulu saniye gösterimi 00 ile 59 arasında
Örnek format Örnek sonuç
“ay, yil” Ocak, 2010
“kisagun ay, hgun” 7 Ocak, Pazartesi
“gun-aysayi-kisayil saat:dakika:saniye” 07-01-10 12:10:54

$zaman:

Biçimlendirilecek zamanı belirtir. Eğer girilmemişse o anki zaman kullanılır. $zaman değeri strtotime fonksiyonun kabul ettiği tüm değerler olabilir. MySQL veritabanından aldığınız değerleri doğrudan kullanabilirsiniz. Aşağıda bu parametrenin alabileceği bazı değerler örneklenmiştir:
“31-12-2009 13:23:10″
“2009-12-31 13:23:10″
“31-12-2009″
“3 gun once”
“-3 gun”
“+5 gun”
“2 yil sonra”

Kullanım Örnekleri

echo tarih("gun/ay/yil saat:dakika:saniye")."; ";
// çıktısı: 30/Aralık/2009 01:06:58;
echo tarih("gun-ay-yil, hgun saat:dakika", "3 gun once")."; ";
// çıktısı: 27-Aralık-2009, Pazar 01:06;
echo tarih("kisagun-kisaaysayi-kisayil, hgun saat:dakika", "+2 ay")."; ";
// çıktısı: 2-3-10, Salı 01:08;
echo tarih("yil.ay.gun saat:dakika:saniye", "2009-12-20 12:10:23")."; ";
// çıktısı: 2009.Aralık.20 12:10:23;
echo tarih("gun ay yil saat:dakika", "20081118100630");
// çıktısı: 18 Kasım 2008 10:06

Kod

$aylarIng=array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
$aylarKisaIng=array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
$gunlerIng=array("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday");
$gunlerKisaIng=array("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun");
$aylar=array("Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık");
$aylarKisa=array("Oca", "Åžub", "Mar", "Nis", "May", "Haz", "Tem", "AÄŸu", "Eyl", "Eki", "Kas", "Ara");
$gunler=array("Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi", "Pazar");
$gunlerKisa=array("Pt", "Sa", "Ça", "Pe", "Cu", "Ct", "Pa");
 
/**
 * tarihi turkceye cevirir. tarih temelde date fonksiyonu ile olusturulur.
 * $zaman ise strtotime ile timestamp'e cevrilir. $format'in kullanımi
 * date fonksiyonunda oldugu gibidir. ayni sekilde  $zaman'in alacagi degerler
 * strtotime fonksiyonuna uygun secilebilir.
 *
 * @global array    $aylarIng, $aylar, $gunlerIng, $gunler, $aylarKisaIng,
 *                      $aylarKisa, $gunlerKisaIng, $gunlerKisa
 * @param str       $format
 * @param str/int   $zaman
 * @return str
 */
function tarih($format, $zaman=null){
    if(!$zaman) $zaman=time();
    else{
        $zaman=str_ireplace(array("once","ay", "gun", "yil","dakika","saniye","hafta"),
                           array("ago","month","day","year","minute","second","week"), $zaman);
        $zaman=strtotime($zaman);
    }
    $format=str_ireplace(
        array("kisaaysayi","kisaay","aysayi","kisagun","hgunkisa","hgun","gun","kisayil","yil","kisasaat","saat","dakika","saniye", "ay"),
        array("n",         "M",     "m",     "j",      "D",       "l",   "d",  "y",      "Y",  "h",       "H",   "i",     "s",      "F"),
        $format);
    $tarihStr=date($format, $zaman);
    if(strpos($format, "F")!==false){
        global $aylarIng, $aylar;
        $tarihStr=str_replace($aylarIng, $aylar, $tarihStr);
    }
    if(strpos($format, "l")!==false){
        global $gunlerIng, $gunler;
        $tarihStr=str_replace($gunlerIng, $gunler, $tarihStr);
    }
    if(strpos($format, "M")!==false){
        global $aylarKisaIng, $aylarKisa;
        $tarihStr=str_replace($aylarKisaIng, $aylarKisa, $tarihStr);
    }
    if(strpos($format, "D")!==false){
        global $gunlerKisaIng, $gunlerKisa;
        $tarihStr=str_replace($gunlerKisaIng, $gunlerKisa, $tarihStr);
    }
    return $tarihStr;
}

Kaynaklar:
‘date’ fonksiyonu

SetLocale ile Türkçe Tarih&Saat

Aslında strftime fonksiyonunu kullanarak da türkçe tarih gösterebiliyorsunuz. Fakat bunun için sunucunun bölgesel ayarlarının türkçe olacak şekilde değiştirilmiş olması gerekiyor. Bu ayar yapılamamış olsa bile eğer sunucunuz buna izin veriyorsa PHP kodunuzun başına bir yerlere
setlocale(LC_TIME, ‘tr_TR’);
satırını ekleyerek bölgesel ayarları türkçeye uygun hale getirebilirsiniz. Test için şu php kodunu suncunuzda çalıştırınız:

setlocale(LC_TIME, 'tr_TR');
echo strftime('%A, %d. %B %Y');

EÄŸer ‘Salı, 05. Ocak 2010′ gibi bir sonuç alıyorsanız bu yöntemi kullanabilirsiniz.

Kaynaklar:
’strftime’ fonksiyonu
’setlocale’ fonksiyonu

Youtube’da ya da kullanıcıların yorumlarının yayınlandığı pek çok yerde görmüşsünüzdür: yorumun yazılış tarihi, 12 Ekim 2009, 12:24 gibi net bir tarih olarak deÄŸil de aradan geçen süre bazında (2 gün önce, 5 yıl önce, vb…) gösterilir.

AÅŸağıdaki bu iÅŸi türkçe olarak yapan bir PHP fonksiyonu bulunmakta. PHP’de bulunan strtotime fonksiyonunun kabul ettiÄŸi her türlü tarih deÄŸerini girdi olarak kullanabilirsiniz. Bu da veritabanınızdan aldığınız tarihi çok büyük ihtimalle direkt olarak kullanabileceÄŸiniz anlamına gelir. Fonksiyonun kullanım ÅŸekli, başındaki açıklama satırlarında mevcuttur.

Tarihi türkçe olarak doÄŸrudan ‘12 Ekim 2009′, ‘07-AÄŸustos-2008, Cumartesi’ gibi ÅŸekillerde yazdırmak istiyorsanız PHP ile Türkçe Tarih Gösterimi-Çevrimi baÅŸlıklı yazıya gözatmanız daha doÄŸru olur.

/**
 * verilen tarihler arasında geçen süreyi "1 gün önce", "2 hafta önce" gibi
 * günlük kullanım'a uygun kolay anlaşılır bir şekle çevirir. Normal kullanımda
 * o anki tarih baz alınır.
 * İstenirse ikinci parametre kullanılarak, girilen iki tarih arasındaki
 * fark alınabilir.
 * Örnek Kullanım (şu anki tarihi 2009-08-25 13:00:00 olarak kabul edersek):
 *      echo "çıktı: ".cicitarih("2009-08-23 12:05:14"); // çıktı: 2 gün önce
 *      echo "çıktı: ".cicitarih("2009-04-23 10:00:00"); // çıktı: 4 ay önce
 *      echo "çıktı: ".cicitarih("2009-04-23 10:00:00", "2009-05-24 11:00");
 *                                                       //çıktı: 1 ay önce
 * @author gudubeth.net
 * @param str $tarih    hesabın yapılacağı tarih. strtotime fonksiyonu
 *                      tarafından kulanılabilecek her türlü string değerini
 *                      alabilir.
 *                      bkz: http://www.php.net/manual/tr/function.strtotime.php
 * @param str $simdi    boş bırakılırsa, o anki saat baz alınır.
 *                      formatı $tarih alanında olduğı gibidir.
 * @return str
 */
function cicitarih($tarih, $simdi=null){
 
    //aradan geçen süreyi bul
    if(!$simdi) $simdi=time();
    $sure=$simdi-strtotime($tarih);
 
    //eğer geçen süre negatif ise boş metin döndür.
    if($sure&lt;0) return "";
 
    //dönüş metninin oluşturulduğu yer
    //3600: 60*60, yani 1 saat;
    //86400: 60*60*24 yani 1 gün demektir.
    if($sure&lt;60)return round($sure)." saniye önce";
    else if($sure<3600) return round($sure/60)." dakika önce";
    else if($sure<86400) return round($sure/(3600))." saat önce";
    else if($sure<86400*7) return round($sure/(86400))." gün önce";
    else if($sure<86400*30) return round($sure/(86400*7))." hafta önce";
    else if($sure<86400*365) return round($sure/(86400*30))." ay önce";
    else  return round($sure/(86400*365))." yıl önce";
}