복붙노트

PHP : 타임 스탬프에서 상대 날짜 / 시간 생성하기

PHP

PHP : 타임 스탬프에서 상대 날짜 / 시간 생성하기

저는 기본적으로 유닉스 타임 스탬프 (time () 함수)를 과거와 미래의 날짜와 호환되는 상대 날짜 / 시간으로 변환하려고합니다. 출력은 다음과 같습니다.

먼저 코드를 작성하려고했으나 유지할 수없는 큰 기능을 만들었습니다. 그런 다음 인터넷을 두 시간 동안 검색했지만 아직 찾을 수있는 부분은 시간의 일부만 생성하는 스크립트입니다 (예 : "1 시간 전"없이 분).

이미이 작업을 수행하고있는 스크립트가 있습니까?

해결법

  1. ==============================

    1.이 함수는 '지금'과 '특정 시간 소인'사이의 결과처럼 '1 시간 전'또는 '내일'을 제공합니다.

    이 함수는 '지금'과 '특정 시간 소인'사이의 결과처럼 '1 시간 전'또는 '내일'을 제공합니다.

    function time2str($ts)
    {
        if(!ctype_digit($ts))
            $ts = strtotime($ts);
    
        $diff = time() - $ts;
        if($diff == 0)
            return 'now';
        elseif($diff > 0)
        {
            $day_diff = floor($diff / 86400);
            if($day_diff == 0)
            {
                if($diff < 60) return 'just now';
                if($diff < 120) return '1 minute ago';
                if($diff < 3600) return floor($diff / 60) . ' minutes ago';
                if($diff < 7200) return '1 hour ago';
                if($diff < 86400) return floor($diff / 3600) . ' hours ago';
            }
            if($day_diff == 1) return 'Yesterday';
            if($day_diff < 7) return $day_diff . ' days ago';
            if($day_diff < 31) return ceil($day_diff / 7) . ' weeks ago';
            if($day_diff < 60) return 'last month';
            return date('F Y', $ts);
        }
        else
        {
            $diff = abs($diff);
            $day_diff = floor($diff / 86400);
            if($day_diff == 0)
            {
                if($diff < 120) return 'in a minute';
                if($diff < 3600) return 'in ' . floor($diff / 60) . ' minutes';
                if($diff < 7200) return 'in an hour';
                if($diff < 86400) return 'in ' . floor($diff / 3600) . ' hours';
            }
            if($day_diff == 1) return 'Tomorrow';
            if($day_diff < 4) return date('l', $ts);
            if($day_diff < 7 + (7 - date('w'))) return 'next week';
            if(ceil($day_diff / 7) < 4) return 'in ' . ceil($day_diff / 7) . ' weeks';
            if(date('n', $ts) == date('n') + 1) return 'next month';
            return date('F Y', $ts);
        }
    }
    
  2. ==============================

    2.

    function relativeTime($time) {
    
        $d[0] = array(1,"second");
        $d[1] = array(60,"minute");
        $d[2] = array(3600,"hour");
        $d[3] = array(86400,"day");
        $d[4] = array(604800,"week");
        $d[5] = array(2592000,"month");
        $d[6] = array(31104000,"year");
    
        $w = array();
    
        $return = "";
        $now = time();
        $diff = ($now-$time);
        $secondsLeft = $diff;
    
        for($i=6;$i>-1;$i--)
        {
             $w[$i] = intval($secondsLeft/$d[$i][0]);
             $secondsLeft -= ($w[$i]*$d[$i][0]);
             if($w[$i]!=0)
             {
                $return.= abs($w[$i]) . " " . $d[$i][1] . (($w[$i]>1)?'s':'') ." ";
             }
    
        }
    
        $return .= ($diff>0)?"ago":"left";
        return $return;
    }
    

    용법:

    echo relativeTime((time()-256));
    4 minutes 16 seconds ago
    
  3. ==============================

    3.여기 제가 작성한 것이 있습니다. 오늘 날짜를 기준으로 과거 날짜를 표시합니다.

    여기 제가 작성한 것이 있습니다. 오늘 날짜를 기준으로 과거 날짜를 표시합니다.

    /**
     * @param $date integer of unixtimestamp format, not actual date type
     * @return string
     */
    function zdateRelative($date)
    {
        $now = time();
        $diff = $now - $date;
    
        if ($diff < 60){
            return sprintf($diff > 1 ? '%s seconds ago' : 'a second ago', $diff);
        }
    
        $diff = floor($diff/60);
    
        if ($diff < 60){
            return sprintf($diff > 1 ? '%s minutes ago' : 'one minute ago', $diff);
        }
    
        $diff = floor($diff/60);
    
        if ($diff < 24){
            return sprintf($diff > 1 ? '%s hours ago' : 'an hour ago', $diff);
        }
    
        $diff = floor($diff/24);
    
        if ($diff < 7){
            return sprintf($diff > 1 ? '%s days ago' : 'yesterday', $diff);
        }
    
        if ($diff < 30)
        {
            $diff = floor($diff / 7);
    
            return sprintf($diff > 1 ? '%s weeks ago' : 'one week ago', $diff);
        }
    
        $diff = floor($diff/30);
    
        if ($diff < 12){
            return sprintf($diff > 1 ? '%s months ago' : 'last month', $diff);
        }
    
        $diff = date('Y', $now) - date('Y', $date);
    
        return sprintf($diff > 1 ? '%s years ago' : 'last year', $diff);
    }
    
  4. ==============================

    4.나는 xdebug에 의해 relativeTime 함수를 좋아한다. 문제는 약간의 세분화가 필요하다는 것입니다.

    나는 xdebug에 의해 relativeTime 함수를 좋아한다. 문제는 약간의 세분화가 필요하다는 것입니다.

    즉, 내가 결정하면 초 또는 분 단위로 중지합니다. 그래서 지금,

    echo fTime(strtotime('-23 hours 5 minutes 55 seconds'),0); 
    

    보여줄 것입니다,

    대신에

    또한 더 높은 시간 량에 도달하면 배열에서 더 낮게 가지 않기를 원했습니다. 그래서 몇 년을 보여 주면, 나는 단지 몇 년과 몇 달을 보여주고 싶습니다. 그래서 지금,

    echo fTime(strtotime('-1 year 2 months 3 weeks 4 days 16 hours 15 minutes 22 seconds'),0); 
    

    보여 줄까요?

    대신에

    다음 코드 변경은 내가 필요한 것을 수행했다. 소품은 물론 xdebug에갑니다. 바라건대 다른 누군가가 유용하다고 생각하기를 바랍니다.

    function fTime($time, $gran=-1) {
    
        $d[0] = array(1,"second");
        $d[1] = array(60,"minute");
        $d[2] = array(3600,"hour");
        $d[3] = array(86400,"day");
        $d[4] = array(604800,"week");
        $d[5] = array(2592000,"month");
        $d[6] = array(31104000,"year");
    
        $w = array();
    
        $return = "";
        $now = time();
        $diff = ($now-$time);
        $secondsLeft = $diff;
        $stopat = 0;
        for($i=6;$i>$gran;$i--)
        {
             $w[$i] = intval($secondsLeft/$d[$i][0]);
             $secondsLeft -= ($w[$i]*$d[$i][0]);
             if($w[$i]!=0)
             {
                $return.= abs($w[$i]) . " " . $d[$i][1] . (($w[$i]>1)?'s':'') ." ";
                 switch ($i) {
                    case 6: // shows years and months
                        if ($stopat==0) { $stopat=5; }
                        break;
                    case 5: // shows months and weeks
                        if ($stopat==0) { $stopat=4; }
                        break;
                    case 4: // shows weeks and days
                        if ($stopat==0) { $stopat=3; }
                        break;
                    case 3: // shows days and hours
                        if ($stopat==0) { $stopat=2; }
                        break;
                    case 2: // shows hours and minutes
                        if ($stopat==0) { $stopat=1; }
                        break;
                    case 1: // shows minutes and seconds if granularity is not set higher
                        break;
                 }
                 if ($i===$stopat) { break 0; }
             }
        }
    
        $return .= ($diff>0)?"ago":"left";
        return $return;
    }
    

    마커스

  5. ==============================

    5.아래에 나와있는 결과를 줄 필요가있어서 자기 자신을 썼다. 바라기를 이것은 누군가를 도울 것입니다.

    아래에 나와있는 결과를 줄 필요가있어서 자기 자신을 썼다. 바라기를 이것은 누군가를 도울 것입니다.

    사용 예 :

    $datetime = "2014-08-13 12:52:48";  
    echo getRelativeTime($datetime);    //10 hours ago  
    echo getRelativeTime($datetime, 1); //10 hours ago  
    echo getRelativeTime($datetime, 2); //10 hours and 50 minutes ago  
    echo getRelativeTime($datetime, 3); //10 hours, 50 minutes and 50 seconds ago  
    echo getRelativeTime($datetime, 4); //10 hours, 50 minutes and 50 seconds ago  
    

    암호:

    public function getRelativeTime($datetime, $depth=1) {
    
        $units = array(
            "year"=>31104000,
            "month"=>2592000,
            "week"=>604800,
            "day"=>86400,
            "hour"=>3600,
            "minute"=>60,
            "second"=>1
        );
    
        $plural = "s";
        $conjugator = " and ";
        $separator = ", ";
        $suffix1 = " ago";
        $suffix2 = " left";
        $now = "now";
        $empty = "";
    
        # DO NOT EDIT BELOW
    
        $timediff = time()-strtotime($datetime);
        if ($timediff == 0) return $now;
        if ($depth < 1) return $empty;
    
        $max_depth = count($units);
        $remainder = abs($timediff);
        $output = "";
        $count_depth = 0;
        $fix_depth = true;
    
        foreach ($units as $unit=>$value) {
            if ($remainder>$value && $depth-->0) {
                if ($fix_depth) {
                    $max_depth -= ++$count_depth;
                    if ($depth>=$max_depth) $depth=$max_depth;
                    $fix_depth = false;
                }
                $u = (int)($remainder/$value);
                $remainder %= $value;
                $pluralise = $u>1?$plural:$empty;
                $separate = $remainder==0||$depth==0?$empty:
                                ($depth==1?$conjugator:$separator);
                $output .= "{$u} {$unit}{$pluralise}{$separate}";
            }
            $count_depth++;
        }
        return $output.($timediff<0?$suffix2:$suffix1);
    }
    
  6. ==============================

    6.packagist를 통해 Carbon을 사용할 수 있습니다. :) https://github.com/briannesbitt/Carbon#api-humandiff

    packagist를 통해 Carbon을 사용할 수 있습니다. :) https://github.com/briannesbitt/Carbon#api-humandiff

  7. ==============================

    7.다음은 과거의 시간에 사용하는 것입니다.

    다음은 과거의 시간에 사용하는 것입니다.

    function zdateRelative($date)
    {
      $diff = time() - $date;
      $periods[] = [60, 1, '%s seconds ago', 'a second ago'];
      $periods[] = [60*100, 60, '%s minutes ago', 'one minute ago'];
      $periods[] = [3600*70, 3600, '%s hours ago', 'an hour ago'];
      $periods[] = [3600*24*10, 3600*24, '%s days ago', 'yesterday'];
      $periods[] = [3600*24*30, 3600*24*7, '%s weeks ago', 'one week ago'];
      $periods[] = [3600*24*30*30, 3600*24*30, '%s months ago', 'last month'];
      $periods[] = [INF, 3600*24*265, '%s years ago', 'last year'];
      foreach ($periods as $period) {
        if ($diff > $period[0]) continue;
        $diff = floor($diff / $period[1]);
        return sprintf($diff > 1 ? $period[2] : $period[3], $diff);
      }
    }
    
  8. ==============================

    8.드루팔 (Drupal)이하는 방식을 왜 찢어 버리지 않는지 - http://api.drupal.org/api/drupal/includes%21common.inc/function/format_interval/7

    드루팔 (Drupal)이하는 방식을 왜 찢어 버리지 않는지 - http://api.drupal.org/api/drupal/includes%21common.inc/function/format_interval/7

    <?php
    function format_interval($interval, $granularity = 2, $langcode = NULL) {
      $units = array(
        '1 year|@count years' => 31536000, 
        '1 month|@count months' => 2592000, 
        '1 week|@count weeks' => 604800, 
        '1 day|@count days' => 86400, 
        '1 hour|@count hours' => 3600, 
        '1 min|@count min' => 60, 
        '1 sec|@count sec' => 1,
      );
      $output = '';
      foreach ($units as $key => $value) {
        $key = explode('|', $key);
        if ($interval >= $value) {
          $output .= ($output ? ' ' : '') . format_plural(floor($interval / $value), $key[0], $key[1], array(), array('langcode' => $langcode));
          $interval %= $value;
          $granularity--;
        }
    
        if ($granularity == 0) {
          break;
        }
      }
      return $output ? $output : t('0 sec', array(), array('langcode' => $langcode));
    }
    ?>
    

    아마도 t ()를 대체 할 필요는 없으며 여러 언어를 지원할 필요가 없으므로 format_plural에 대한 자신 만의 일을 할 수 있습니다. http://api.drupal.org/api/drupal/includes%21common.inc/function/format_plural/7

  9. from https://stackoverflow.com/questions/2690504/php-producing-relative-date-time-from-timestamps by cc-by-sa and MIT license