Skip to content

Instantly share code, notes, and snippets.

@DKepov
Last active October 3, 2015 09:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DKepov/10fb1ba0663301394025 to your computer and use it in GitHub Desktop.
Save DKepov/10fb1ba0663301394025 to your computer and use it in GitHub Desktop.
display diff time for human
<php

class Date{

	/**
	 * Функция, формирующая человекочитабельное представление разницы дат
	 *
	 * @param int $from Временная метка, от которой считаем
	 * @param int $to Относительная временная метка (если не задано, то сейчас)
	 * @param int $precision Сколько уровней, включая первый, нужно показать
	 * @param bool $short_form Использует формат "2h 30m" вместо "2 hours 30 mins"
	 *
	 * @return string
	 */
	public static function human_time_diff($from, $to = NULL, $precision = 2, $short_form = FALSE)
	{
		if ($to === NULL)
		{
			$to = time();
		}

		if ($to - $from < 60)
		{
			return $short_form ? '0m' : '0 mins';
		}

		$output = array();
		$levels = array(
			'years' => array('years', 'year'),
			'months' => array('months', 'month'),
			'weeks' => array('weeks', 'week'),
			'days' => array('days', 'day'),
			'hours' => array('hours', 'hour'),
			'minutes' => array('mins', 'min'),
		);
		$span = Date::span($from, $to, 'years,months,weeks,days,hours,minutes');
		// Берем и выводим $precision заполненных уровней, начиная с первого заполненного
		foreach ($span as $level => $value)
		{
			if ( ! isset($recording))
			{
				if ($value == 0)
					continue;
				$recording = TRUE;
			}
			if ($value != 0)
			{
				if ($short_form)
				{
					// Краткая форма записи: 2h 30m
					$output[] = $value.$level[0];
				}
				else
				{
					// Полная форма записи: 2 hours 30 mins
					$output[] = $value.' '.$levels[$level][(int)($value == 1)];
				}
			}
			if (--$precision == 0)
				break;
		}
		return implode(' ', $output);
	}

}
@DKepov
Copy link
Author

DKepov commented Sep 29, 2015

class Date{

    /**
     * Функция, формирующая человекочитабельное представление разницы дат
     *
     * @param int $from Временная метка, от которой считаем
     * @param int $to Относительная временная метка (если не задано, то сейчас)
     * @param int $precision Сколько уровней, включая первый, нужно показать
     * @param bool $short_form Использует формат "2h 30m" вместо "2 hours 30 mins"
     *
     * @return string
     */
    public static function human_time_diff($from, $to = NULL, $precision = 2, $short_form = FALSE)
    {
        if ($to === NULL)
        {
            $to = time();
        }

        if ($to - $from < 60)
        {
            return $short_form ? '0m' : '0 mins';
        }

        $output = array();
        $levels = array(
            'years' => array('years', 'year'),
            'months' => array('months', 'month'),
            'weeks' => array('weeks', 'week'),
            'days' => array('days', 'day'),
            'hours' => array('hours', 'hour'),
            'minutes' => array('mins', 'min'),
        );
        $span = Date::span($from, $to, 'years,months,weeks,days,hours,minutes');
        // Берем и выводим $precision заполненных уровней, начиная с первого заполненного
        foreach ($span as $level => $value)
        {
            if ( ! isset($recording))
            {
                if ($value == 0)
                    continue;
                $recording = TRUE;
            }
            if ($value != 0)
            {
                if ($short_form)
                {
                    // Краткая форма записи: 2h 30m
                    $output[] = $value.$level[0];
                }
                else
                {
                    // Полная форма записи: 2 hours 30 mins
                    $output[] = $value.' '.$levels[$level][(int)($value == 1)];
                }
            }
            if (--$precision == 0)
                break;
        }
        return implode(' ', $output);
    }

}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment