Formát času (před hodinou, včera, …)

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Krupička
Člen | 45
+
0
-

Ahoj, potřeboval bych při zobrazování času vytvořit formát jako je zde na foru při přidávání příspěvků. Např. před minutou, včera, před 2 dny atd.. nevím vůbec pod čím to hledat. Nemáte někdo nějaký tip?

Pavel Kravčík
Člen | 1196
+
+1
-

Diff si převeď na sekundy a jednoduchý if.

if($diff < 60)
{
	echo "Nedávno";
}
elseif($diff < 3600)
{
	echo "Před " . floor($diff/60) . " minutami";
}
...

Editoval Pavel Kravčík (15. 2. 2017 12:23)

Martk
Člen | 661
+
+4
-

Zadat timeago do googlu nebo githubu. Toto je v php a v češtině, můžeš vyzkoušet: https://github.com/…php-time-ago

blaztar
Člen | 93
+
+2
-

U mě funguje toto, kdysi to měl David Grudl někde na githubu tuším (možná to je to co je použito zde na fóru). mám to jako filtr:

services:
	- Front\Filter\ForHumans

	nette.latteFactory:
		setup:
			- addFilter('forHumans', @Front\Filter\ForHumans)
<?php

namespace Front\Filter;

use Nette;

class ForHumans extends Nette\Object
{
    public function __invoke($time)
    {
        if (!$time) {
            return false;
        } elseif (is_numeric($time)) {
            $time = (int) $time;
        } elseif ($time instanceof \DateTime) {
            $time = $time->format('U');
        } else {
            $time = strtotime($time);
        }
        $delta = time() - $time;
        if ($delta < 0) {
            $delta = round(abs($delta) / 60);
            if ($delta === 0) {
                return 'za okamžik';
            }
            if ($delta === 1) {
                return 'za minutu';
            }
            if ($delta < 45) {
                return 'za '.$delta.' '.self::plural($delta, 'minuta', 'minuty', 'minut');
            }
            if ($delta < 90) {
                return 'za hodinu';
            }
            if ($delta < 1440) {
                return 'za '.round($delta / 60).' '.self::plural(round($delta / 60), 'hodina', 'hodiny', 'hodin');
            }
            if ($delta < 2880) {
                return 'zítra';
            }
            if ($delta < 43200) {
                return 'za '.round($delta / 1440).' '.self::plural(round($delta / 1440), 'den', 'dny', 'dní');
            }
            if ($delta < 86400) {
                return 'za měsíc';
            }
            if ($delta < 525960) {
                return 'za '.round($delta / 43200).' '.self::plural(round($delta / 43200), 'měsíc', 'měsíce', 'měsíců');
            }
            if ($delta < 1051920) {
                return 'za rok';
            }

            return 'za '.round($delta / 525960).' '.self::plural(round($delta / 525960), 'rok', 'roky', 'let');
        }
        $delta = round($delta / 60);
        if ($delta === 0) {
            return 'před okamžikem';
        }
        if ($delta === 1) {
            return 'před minutou';
        }
        if ($delta < 45) {
            return "před $delta minutami";
        }
        if ($delta < 90) {
            return 'před hodinou';
        }
        if ($delta < 1440) {
            return 'před '.round($delta / 60).' hodinami';
        }
        if ($delta < 2880) {
            return 'včera';
        }
        if ($delta < 43200) {
            return 'před '.round($delta / 1440).' dny';
        }
        if ($delta < 86400) {
            return 'před měsícem';
        }
        if ($delta < 525960) {
            return 'před '.round($delta / 43200).' měsíci';
        }
        if ($delta < 1051920) {
            return 'před rokem';
        }

        return 'před '.round($delta / 525960).' lety';
    }

    private static function plural($n)
    {
        $args = func_get_args();

        return $args[($n === 1) ? 1 : (($n >= 2 && $n <= 4) ? 2 : 3)];
    }
}

Editoval blaztar (15. 2. 2017 12:42)