change Php date in days ago

前端 未结 1 1322
名媛妹妹
名媛妹妹 2021-01-24 09:33

I am using a component on Joumla that returns dates in this format: 2 months and 6 days ago. But I need the date to be displayed like this: xx seconds ago or xx minutes ago or

相关标签:
1条回答
  • 2021-01-24 10:32

    This is an adaptation of Date_HumanDiff class

        date_default_timezone_set('GMT');
    
        function getDifference($timestamp, $reference = null) {
            static $MINUTE = 60;
            static $HOUR   = 3600;    //static::$MINUTE * 60
            static $DAY    = 86400;   //static::$HOUR * 24
            static $WEEK   = 604800;  //static::$DAY * 7
            static $MONTH  = 2628000; //static::$YEAR / 12
            static $YEAR   = 31536000;//static::$DAY * 365
    
            $formats = array(
                array(0.7 * $MINUTE, '%d seconds ago', 1),
                array(1.5 * $MINUTE, 'a minute ago',   1),
                array( 60 * $MINUTE, '%d minutes ago', $MINUTE),
                array(1.5 * $HOUR,   'an hour ago',    1),
                array(      $DAY,    '%d hours ago',   $HOUR),
                array(  2 * $DAY,    'yesterday',      1),
                array(  7 * $DAY,    '%d days ago',    $DAY),
                array(1.5 * $WEEK,   'a week ago',     1),
                array(      $MONTH,  '%d weeks ago',   $WEEK),
                array(1.5 * $MONTH,  'a month ago',    1),
                array(      $YEAR,   '%d months ago',  $MONTH),
                array(1.5 * $YEAR,   'a year ago',     1),
                array(PHP_INT_MAX,   '%d years ago',   $YEAR)
            );
    
            $futureformats = array(
                array(0.7 * $MINUTE, 'in a moment',   -1),
                array(1.5 * $MINUTE, 'in a minute',   -1),
                array( 60 * $MINUTE, 'in %d minutes', -$MINUTE),
                array(1.5 * $HOUR,   'in an hour',    -1),
                array(      $DAY,    'in %d hours',   -$HOUR),
                array(  2 * $DAY,    'tomorrow',      -1),
                array(  7 * $DAY,    'in %d days',    -$DAY),
                array(1.5 * $WEEK,   'in a week',     -1),
                array(      $MONTH,  'in %d weeks',   -$WEEK),
                array(1.5 * $MONTH,  'in a month',    -1),
                array(      $YEAR,   'in %d months',  -$MONTH),
                array(1.5 * $YEAR,   'in a year',     -1),
                array(PHP_INT_MAX,   'in %d years',   -$YEAR)
            );
    
    
            if ($reference === null) {
                $reference = time();
            }
    
            $timestamp = ($timestamp instanceof DateTime) ? $timestamp->getTimestamp() : (is_numeric($timestamp) ? (int)$timestamp : strtotime($timestamp));
            $reference = ($reference instanceof DateTime) ? $reference->getTimestamp() : (is_numeric($reference) ? (int)$reference : strtotime($reference));
    
            $delta = $reference - $timestamp;
    
            if ($delta >= 0) {
                foreach ($formats as $format) {
                    if ($delta < $format[0]) {
                        return sprintf($format[1], round($delta / $format[2]));
                    }
                };
            } else {
                foreach ($futureformats as $format) {
                    if (-$delta < $format[0]) {
                        return sprintf($format[1], round($delta / $format[2]));
                    }
                };
    
            }
        }
    
        // will output 52 minutes ago
        echo getDifference('2014-01-15 15:24:00', '2014-01-15 16:16:12') . PHP_EOL;
    
        // without second param will output difference with the current time
        echo getDifference('2014-01-15 15:24:00') . PHP_EOL;
    
    0 讨论(0)
提交回复
热议问题