Salavert\Twig\Extension\TimeAgoExtension::distanceOfTimeInWordsFilter PHP Метод

distanceOfTimeInWordsFilter() публичный Метод

For example, if the distance is 47 minutes, it'll return "about 1 hour". See the source for the complete wording list. Integers are interpreted as seconds. So, by example to check the distance of time between a created user and their last login: {{ user.createdAt|distance_of_time_in_words(user.lastLoginAt) }} returns "less than a minute". Set include_seconds to true if you want more detailed approximations if distance < 1 minute Set include_months to true if you want approximations in months if days > 30
public distanceOfTimeInWordsFilter ( string | DateTime $from_time, string | DateTime $to_time = null, boolean $include_seconds = false, boolean $include_months = false ) : string
$from_time string | DateTime
$to_time string | DateTime
$include_seconds boolean True to return distance in seconds when it's lower than a minute.
$include_months boolean
Результат string
    public function distanceOfTimeInWordsFilter($from_time, $to_time = null, $include_seconds = false, $include_months = false)
    {
        $datetime_transformer = new DateTimeToStringTransformer(null, null, 'Y-m-d H:i:s');
        $timestamp_transformer = new DateTimeToTimestampTransformer();
        // Transform “from” to timestamp
        if ($from_time instanceof \DateTime) {
            $from_time = $timestamp_transformer->transform($from_time);
        } elseif (!is_numeric($from_time)) {
            $from_time = $datetime_transformer->reverseTransform($from_time);
            $from_time = $timestamp_transformer->transform($from_time);
        }
        $to_time = empty($to_time) ? new \DateTime('now') : $to_time;
        // Transform “to” to timestamp
        if ($to_time instanceof \DateTime) {
            $to_time = $timestamp_transformer->transform($to_time);
        } elseif (!is_numeric($to_time)) {
            $to_time = $datetime_transformer->reverseTransform($to_time);
            $to_time = $timestamp_transformer->transform($to_time);
        }
        $future = $to_time < $from_time;
        $distance_in_minutes = round(abs($to_time - $from_time) / 60);
        $distance_in_seconds = round(abs($to_time - $from_time));
        if ($future) {
            return $this->future($distance_in_minutes, $include_seconds, $distance_in_seconds);
        }
        if ($distance_in_minutes <= 1) {
            if ($include_seconds) {
                if ($distance_in_seconds < 5) {
                    return $this->translator->trans('less than %seconds seconds ago', array('%seconds' => 5));
                }
                if ($distance_in_seconds < 10) {
                    return $this->translator->trans('less than %seconds seconds ago', array('%seconds' => 10));
                }
                if ($distance_in_seconds < 20) {
                    return $this->translator->trans('less than %seconds seconds ago', array('%seconds' => 20));
                }
                if ($distance_in_seconds < 40) {
                    return $this->translator->trans('half a minute ago');
                }
                if ($distance_in_seconds < 60) {
                    return $this->translator->trans('less than a minute ago');
                }
                return $this->translator->trans('1 minute ago');
            }
            return $distance_in_minutes == 0 ? $this->translator->trans('less than a minute ago') : $this->translator->trans('1 minute ago');
        }
        if ($distance_in_minutes <= 45) {
            return $this->translator->trans('%minutes minutes ago', array('%minutes' => $distance_in_minutes));
        }
        if ($distance_in_minutes <= 90) {
            return $this->translator->trans('about 1 hour ago');
        }
        if ($distance_in_minutes <= 1440) {
            return $this->translator->trans('about %hours hours ago', array('%hours' => round($distance_in_minutes / 60)));
        }
        if ($distance_in_minutes <= 2880) {
            return $this->translator->trans('1 day ago');
        }
        $distance_in_days = round($distance_in_minutes / 1440);
        if (!$include_months || $distance_in_days <= 30) {
            return $this->translator->trans('%days days ago', array('%days' => round($distance_in_days)));
        }
        if ($distance_in_days < 345) {
            return $this->translator->transchoice('{1} 1 month ago |]1,Inf[ %months months ago', round($distance_in_days / 30), array('%months' => round($distance_in_days / 30)));
        }
        return $this->translator->transchoice('{1} 1 year ago |]1,Inf[ %years years ago', round($distance_in_days / 365), array('%years' => round($distance_in_days / 365)));
    }

Usage Example

Пример #1
0
 /**
  * Launching tests twice: dates as strings and as DateTime objects.
  * Both arguments are accepted.
  *
  * @param $fromTime
  * @param $toTime
  * @param $expectedTranslation
  * @param bool $includeSeconds
  * @param bool $includeMonths
  */
 private function assertDistanceOfTimeExpectation($fromTime, $toTime, $expectedTranslation, $includeSeconds = self::DEFAULT_INCLUDE_SECONDS, $includeMonths = self::DEFAULT_INCLUDE_MONTHS)
 {
     $fromDateTime = \DateTime::createFromFormat(self::DATE_FORMAT, $fromTime, new \DateTimeZone('GMT'));
     $toDateTime = \DateTime::createFromFormat(self::DATE_FORMAT, $toTime, new \DateTimeZone('GMT'));
     $translationFromDateStrings = $this->extension->distanceOfTimeInWordsFilter($fromTime, $toTime, $includeSeconds, $includeMonths);
     $translationFromDateTimes = $this->extension->distanceOfTimeInWordsFilter($fromDateTime, $toDateTime, $includeSeconds, $includeMonths);
     $this->assertEquals($expectedTranslation, $translationFromDateStrings);
     $this->assertEquals($expectedTranslation, $translationFromDateTimes);
 }