Nasıl derin Codeigniter içinde TimeSpan () işlevi kaç düzeyleri gitmeli belirtebilirsiniz?

2 Cevap php

Ben çok zaman bir olay beri geçen nasıl bir insan okunabilir ifade vermek için CodeIgniter'ın "zaman aralığı ()" fonksiyonunu kullanarak ediyorum: "5 gün, 3 saat, 12 dakika, 1 saniye", ama ben inmek gerek yok dakika veya ikinci seviyeye.

O kapatmak için herhangi bir yolu var mı?

2 Cevap

Kısa cevap: hayır.

TimeSpan () yöntemi çıktı ayrıntı düzeyini özelleştirmek için herhangi bir araç sağlamaz. CodeIgniter olsa da, onlar ne gibi yapmak bu yüzden oldukça kolay yerleşik işlevleri geçersiz hale gelmez.

Orada daha zarif bir çözüm (aşağıya bakınız) olabilir, ama şu ben ile geldi budur olabilir. Uygulama / yardımcıları MY_date_helper.php adında bir dosya oluşturun ve içine zaman için aşağıdaki değişikliği () koymak:

<?php
// Adds a third argument to timespan() that stops display of minutes/
// seconds in the final output
function timespan($seconds = 1, $time = '', $display_mins_secs = true)
{
    $CI =& get_instance();
    $CI->lang->load('date');

    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')).', ';
    }   

    $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')).', ';
        }   

        $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')).', ';
        }

        $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')).', ';
        }

        $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')).', ';
        }

        $seconds -= $hours * 3600;
    }

    // don't display minutes/seconds unless $display_mins_secs
    // == true
    if ($display_mins_secs)
    {
        $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')).', ';
            }

            $seconds -= $minutes * 60;
        }

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

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

?>

CodeIgniter automagically bu dosyayı bulmak ve zaman aralığı () işlevi yerine yerleşik sürüm kullanacak. this page in "Yapanlar genişletme" bölümünde, bu nasıl çalıştığı hakkında biraz daha fazla bilgi sunuyor.

"Genişletilmiş" zaman aralığı () fonksiyonunun yararlanmak için, sadece bu gibi yanlış üçüncü bir argüman:

$ Değişken = zaman aralığı ($ saniye, $ zaman, false);

Orada daha zarif bir çözüm belki (bkz: here) PHP'nin DateTime nesnesini kullanarak, muhtemelen, ama sorunundan ben yukarıdaki TimeSpan () değişiklik daha yakından sizin ihtiyaçlarınıza uygun düşünüyorum.

Bu eski bir konu olduğunu biliyorum ama sadece bunu buldum ve ben arıyordum ne için neredeyse bir çözüm oldu. Ben sadece sayısına göre bir seviye sınırı var istedim. Ben Sonra verilen limit kadar dizinin yürümek Ben bir dizi olarak $ str yapmak ve her yıl eklemek komut küçük bir değişiklik, ay, gün vb yaptım. Bundan sonra ben sadece bir "," implode ve sonucu döndürür.

Belki başkası da bu senaryoyu keyfini çıkarabilirsiniz?

<?php
// Adds a third argument to timespan() that limits the text string at given level
function timespan($seconds = 1, $time = '', $limit=null)
{
    $CI =& get_instance();
    $CI->lang->load('date');

    if ( ! is_numeric($seconds))
    {
        $seconds = 1;
    }

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

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

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

    if ($years > 0)
    {   
        $str[] = $years.' '.$CI->lang->line((($years > 1) ? 'date_years' : 'date_year'));
    }   

    $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'));
        }   

        $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'));
        }

        $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'));
        }

        $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'));
        }

        $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'));
        }

        $seconds -= $minutes * 60;
    }

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

    // Only show number of array elements depending on limit.
    if($limit)
    {
        $i = 0;
        foreach($str as $level)
        {
            if($i >= $limit)
                unset($str[$i]);
            $i++;
        }
    }

    $return = implode(', ', $str);

    return trim($return);
}