PHP: formatting time Stackoverflow or Apple Mail-style

后端 未结 1 1425
误落风尘
误落风尘 2021-01-15 18:37

There is this really nice function from the php.net documentation that enables you to format time in a Facebook-style manner (e.g., 2 minutes ago, 4 weeks

相关标签:
1条回答
  • 2021-01-15 19:18

    Ok, i answered my own question.

    The key is to track how many rounds of division the for loop goes through until the quotient of the current time minus the input time, $difference, divided by $jth value of the $lengths array item is less than the $j+1th value of this array.

    I track this by incrementing the variable $i (notice the if/elseif/else clause demonstrating each of the 3 points I mention above) in this modified version of nicetime():

         ///http://php.net/manual/en/function.time.php
      function nicetime($date)
     {
        if(empty($date)) {
          return "No date provided";
        }
    
    $periods         = array("second", "minute", "hour", "day", "week", "month", "year", "decade");
    $lengths         = array("60","60","24","7","4.35","12","10");
    
    $now             = time();
    $unix_date         = strtotime($date);
    
       // check validity of date
    if(empty($unix_date)) {    
        return "Bad date";
    }
    
    // is it future date or past date
    if($now > $unix_date) {    
        $difference     = $now - $unix_date;
        $tense         = "ago";
    
    } else {
        $difference     = $unix_date - $now;
        $tense         = "from now";
    }
    $i=0;
    for($j = 0; $difference >= $lengths[$j] && $j < count($lengths)-1; $j++) {
        $i++;
        $difference /= $lengths[$j];
    }
    
    $difference = round($difference);
    
    if($difference != 1) {
        $periods[$j].= "s";
    }
    
    if($i<3){
        $day="$difference $periods[$j] {$tense}";
        return $day;
        //satisfies case #1 where time is listed as seconds, minutes, hours ago
    }
    
    elseif($i==3){
        $difference == 1 && $periods[$j]=='day' ? $day='yesterday':     
        $day="$difference $periods[$j] {$tense}";
        return $day;        
        //satisfies case #2 where time is listed as yesterday if not the current day
    
    }
    else{
        return $date;       
        // satisfies case #3 where date is listed as M/D/Y if greater than a week old
    }   
    
    }
    
    echo "case#1: ".nicetime('2012-08-13 23:12:16');
    echo "case#2: ".nicetime('2012-08-12 23:12:16');
    echo "case#3: ".nicetime('2012-07-07 23:12:16');
    
    0 讨论(0)
提交回复
热议问题