1

前回の投稿からの経過時間を正確に示している StackOverflow が行っていることを実行したいと思います。ただし、問題があります。SO は、最後の投稿からの経過時間に基づいて特定の情報を表示します。投稿が 1 時間以内の場合は、何分前かなどを投稿します。

次の形式の MYSQL DateTime フィールドを使用しています。

2012-09-19 13:28:45

上記を時間と比較したいNOWので、PHPのstrtotime関数を使用してその時間を変換し、まとめた関数(以下)で2つの日付を比較してみました。確かに、これはおそらくこれを行うための最悪の方法ですが、PHPDateDateTime関数について読んだ後、私は非常に混乱し始めています。

function get_date_format($strToTimeString){

        $minute = 60;
        $hour = $minutes * 60;
        $day = $hour * 24;
        $week = $day * 7;
        $month = $week * 4;
        $year = $month * 12;

        $timeNow = strtotime("now");

        $timeDiff = $timeNow - $strToTimeString;

        if($timeDiff > $minute){
            if($timeDiff > $hour){
                if($timeDiff > $day){
                    if($timeDiff > $week){
                        if($timeDiff > $month){
                            if($timeDiff > $year){
                                // Years ago
                            }
                            else{
                                // Months ago
                            }
                        }
                        else{
                            // Weeks ago
                        }
                    }
                    else{
                        // Days ago
                    }
                }
                else
                {
                    // Hours ago
                }
            }
            else{
                // Minutes ago
            }

        }
        else{
            // Seconds ago
        }


    }

これを行うより良い方法はありますか?上で述べたように、使用しようとすると運が悪かったDateTime->diff

どんな助けでも本当に感謝しています。

4

4 に答える 4

2

を使用しDateTimeます。サンプルは次のとおりです。

$now = new DateTime('now');
$posted = new DateTime($postDateFromDBHere);
$interval = $posted->diff($now);
var_dump($interval);
echo $interval->format('%y-%m-%d %h:%m:%s'); //You can do similar to format your output as you wish.
于 2012-09-28T10:15:19.907 に答える
1

長い間検索した結果、rottentomatoes がフォーラムで使用しているものに近いものを見つけました。

function realTimeSince($time){
    define(MINUTE, 60);
    define(HOUR, 60*60);
    define(DAY, 60*60*24);
    define(MONTH, 60*60*24*30);
    $delta = strtotime(gmdate("Y-m-d H:i:s", time())) - strtotime($time);

    if ($delta < 1 * MINUTE) {
        return $delta == 1 ? "one second ago" : $delta . " seconds ago";
    }
    if ($delta < 2 * MINUTE) {
        return "a minute ago";
    }
    if ($delta < 45 * MINUTE) {
        return floor($delta / MINUTE) . " minutes ago";
    }
    if ($delta < 90 * MINUTE) {
        return "an hour ago";
    }
    if ($delta < 24 * HOUR) {
        return floor($delta / HOUR) . " hours ago";
    }
    if ($delta < 48 * HOUR) {
        return "yesterday";
    }
    if ($delta < 30 * DAY) {
        return floor($delta / DAY) . " days ago";
    }
    if ($delta < 12 * MONTH) {
        $months = floor($delta / DAY / 30);
        return $months <= 1 ? "one month ago" : $months . " months ago";
    } else {
        $years = floor($delta / DAY / 365);
        return $years <= 1 ? "one year ago" : $years . " years ago";
    }
}

次のように使用できます。

realTimeSince('2012-11-12 00:09:54'); //which can be got from a MySQL TIMESTAMP field

http://www.ferdychristant.com/blog//archive/DOMM-7QEFK4に基づいて少し修正

于 2013-01-29T15:59:05.937 に答える
1

各値を使用DateTimeして確認します。DateTime:diff

function returnInterval($date){
    $datetime1 = new DateTime($date);
    $datetime2 = new DateTime();
    $diff = $datetime1->diff($datetime2);
    $string = '';
    $pass = '';

    if($diff->y){
        $string .= ($diff->y == 1) ? $diff->y." year" : $diff->y." years";
        $pass = ', ';
    }
    if($diff->m){
        $string .= $pass;
        $string .= ($diff->m == 1) ? $diff->m." month" : $diff->m." months";
        $pass = ', ';
    }
    if($diff->d){
        $string .= $pass;
        $string .= ($diff->d == 1) ? $diff->d." day" : $diff->d." days";
        $pass = ', ';
    }
    if($diff->h){
        $string .= $pass;
        $string .= ($diff->h == 1) ? $diff->h." hour" : $diff->h." hours";
        $pass = ', ';
    }
    if($diff->i){
        $string .= $pass;
        $string .= ($diff->i == 1) ? $diff->i." minute" : $diff->i." minutes";
        $pass = ', ';
    }
    if($diff->s){
        $string .= $pass;
        $string .= ($diff->s == 1) ? $diff->s." second" : $diff->s." seconds";
    }
    $pos = strrpos($string, ',');
    $string = substr_replace($string, ' and ', $pos, 2);
    return $string;
}

echo returnInterval('2012-09-19 13:28:45');
// 8 days, 13 hours, 47 minutes and 44 seconds
于 2012-09-28T10:15:52.463 に答える
0

次の機能を試してください

 function time_ago($date)
        {
            //echo "ss";
            if (empty($date)) { 
                return "No date provided";
            }      
            $periods = array("sec", "min", "hr", "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";
            }
            for ($j = 0; $difference >= $lengths[$j] && $j < count($lengths)-1; $j++) {
                $difference /= $lengths[$j];
            }
            $difference = round($difference);

            if ($difference != 1 && $j != 0) {
                $periods[$j].= "s";
            }
            if($difference!=0)
            return "$difference $periods[$j] {$tense}";
            else
            return "a few seconds ago";
        }

また

function time_elapsed_since ($postedDateTime){

    $time = time() - $postedDateTime; // to get the time since that moment

         $tokens = array (
                      31536000 => 'year',
                      2592000 => 'month',
                      604800 => 'week',
                      86400 => 'day',
                      3600 => 'hour',
                      60 => 'minute',
                      1 => 'second'
                  );

                  foreach ($tokens as $unit => $text) {
                      if ($time < $unit) continue;
                      $numberOfUnits = floor($time / $unit);
                      return $numberOfUnits.' '.$text.(($numberOfUnits>1)?'s':'');
                  }

    }





time_elapsed_since($postedDateTime).' ago';
于 2012-09-28T10:09:17.677 に答える