Codeigniter timespan Fonksiyonu

Codeigniter timespan Fonksiyonu Codeigniter date_helper içerisinde bulunan timespan fonksiyonunu biraz daha esnek bir hale getiriyoruz.

Codeigniter date_helper içerisinde bulunan timespan fonksiyonu ile geçmişteki bir tarih/zamandan bu zamana kadar ne kadar  "Yıl, Ay, Hafta, Gün, Dakika, Saniye" geçtiğini hesaplayabiliyoruz. Oldukça faydalı bir fonksiyon olsa da bazen ihtiyacımızı biraz fazla karşılıyor smile. Demek istediğim şu ki örneğin 2 yıl önceki bir tarihin dakika ve saniyesi çokta önemli olmaz bizim için. Fonksiyonun bu haliyle kullandığımız zaman "2 Yıl, 1 Ay, 1 Hafta, 2 Gün, 2 Saat, 50 Saniye" gibi değer dönecektir. Demem o ki bu kadar uzun bir ifade yerine "2 Yıl önce" demek bu durumda daha uygun olabilir. Aşağıdaki şekilde fonksiyonu düzenlersek bu sorunun (Bunu sorun olarak nitelemek biraz yanlış olabilir belki...) önüne geçmiş oluruz.

function timespan($seconds = 1, $time = '', $deep = NULL)
    {
        $CI = & get_instance();
        $CI->lang->load('date');
        $current_deep = 0;
        if (!is_numeric($seconds))
        {
            $seconds = 1;
        }

        if (!is_numeric($time))
        {
            $time = time();
        }

        if ($time <= $seconds)
        {
            $seconds = 1;
        }
        else
        {
            $seconds = $time - $seconds;
        }

        $str = '';
        $years = floor($seconds / 31536000);

        if ($years > 0)
        {
            $str .= $years . ' ' . $CI->lang->line((($years > 1) ? 'date_years' : 'date_year')) . ', ';
            if (++$current_deep == $deep)
                return substr(trim($str), 0, -1);
        }

        $seconds -= $years * 31536000;
        $months = floor($seconds / 2628000);

        if ($years > 0 OR $months > 0)
        {
            if ($months > 0)
            {
                $str .= $months . ' ' . $CI->lang->line((($months > 1) ? 'date_months' : 'date_month')) . ', ';
                if (++$current_deep == $deep)
                    return substr(trim($str), 0, -1);
            }

            $seconds -= $months * 2628000;
        }

        $weeks = floor($seconds / 604800);

        if ($years > 0 OR $months > 0 OR $weeks > 0)
        {
            if ($weeks > 0)
            {
                $str .= $weeks . ' ' . $CI->lang->line((($weeks > 1) ? 'date_weeks' : 'date_week')) . ', ';
                if (++$current_deep == $deep)
                    return substr(trim($str), 0, -1);
            }

            $seconds -= $weeks * 604800;
        }

        $days = floor($seconds / 86400);

        if ($months > 0 OR $weeks > 0 OR $days > 0)
        {
            if ($days > 0)
            {
                $str .= $days . ' ' . $CI->lang->line((($days > 1) ? 'date_days' : 'date_day')) . ', ';
                if (++$current_deep == $deep)
                    return substr(trim($str), 0, -1);
            }

            $seconds -= $days * 86400;
        }

        $hours = floor($seconds / 3600);

        if ($days > 0 OR $hours > 0)
        {
            if ($hours > 0)
            {
                $str .= $hours . ' ' . $CI->lang->line((($hours > 1) ? 'date_hours' : 'date_hour')) . ', ';
                if (++$current_deep == $deep)
                    return substr(trim($str), 0, -1);
            }

            $seconds -= $hours * 3600;
        }

        $minutes = floor($seconds / 60);

        if ($days > 0 OR $hours > 0 OR $minutes > 0)
        {
            if ($minutes > 0)
            {
                $str .= $minutes . ' ' . $CI->lang->line((($minutes > 1) ? 'date_minutes' : 'date_minute')) . ', ';
                if (++$current_deep == $deep)
                    return substr(trim($str), 0, -1);
            }

            $seconds -= $minutes * 60;
        }

        if ($str == '')
        {
            $str .= $seconds . ' ' . $CI->lang->line((($seconds > 1) ? 'date_seconds' : 'date_second')) . ', ';
        }

        return substr(trim($str), 0, -1);
    }

Kullanımı Codeigniter kullanıcı kılavuzundan yazdığı şekilde. Burada yaptığımız orijinal fonksiyona 3. bir $deep parametresi eklemek oldu. $deep parametresine verdiğimiz sayı değeri kadar zaman birimi ile değer döndürecektir. Örneğin yukarıdaki örnekte verdiğim değeri hesaplamak istediğimiz zaman;

  • $deep =1 değerini verirsek "2 Yıl"
  • $deep =2 değerini verirsek "2 Yıl, 1 Ay"
  • $deep =3 değerini verirsek "2 Yıl, 1 Ay, 1 Hafta"
  • $deep =4 değerini verirsek "2 Yıl, 1 Ay, 1 Hafta, 2 Gün"
  • $deep =5 değerini verirsek "2 Yıl, 1 Ay, 1 Hafta, 2 Gün, 2 Saat"

şeklinde bir ifadeyle dönecektir.

Bu fonksiyonu application/helpers klasörü içerisinde MY_date_helper.php dosyası içerisine (dosya yoksa oluşturunuz) kaydettikten sonra ister $deep parametresini kullanmadan normal şekilde, ister $deep parametresini kullanarak kısa şekilde zaman birimi oluşturacak şekilde kullanabilirsiniz.

Bu yazı en son 18 Şubat 2011 tarihinde düzenlenmiştir ve güncelliğini yitirmiş olabilir.

  • halil ülker

    tşk ederim.tam istediğim şeyi, fonksiyonu düşündüğümdende daha esnek hale getirerek yapmışsın kullanmaya başladım.hiç bir sorun görünmüyor.

  • Bahadır

    Üzerinde çalıştığım bi projede yeni bi helper oluşturmak yerine bu şekilde kullanıyorum...

    $zaman = timespan(strtotime($tarih), now());
    $zaman = explode(',', $zaman);
    $zaman = $zaman[0];

blog comments powered by Disqus

© Mustafa Navruz 2011 0.0611 sn.

^ Başa Dön