2

私は次のタイムスタンプを持っており、1347216222それを関数で使用して、time_sinceそれが何時間前だったかを時間..分などで確認しています.

<?php

/* Works out the time since the entry post, takes a an argument in unix time (seconds) */
function time_since($original) {
    // array of time period chunks
    $chunks = array(
        array(60 * 60 * 24 * 365 , 'year'),
        array(60 * 60 * 24 * 30 , 'month'),
        array(60 * 60 * 24 * 7, 'week'),
        array(60 * 60 * 24 , 'day'),
        array(60 * 60 , 'hour'),
        array(60 , 'minute'),
    );

    $today = time(); /* Current unix time  */
    $since = $today - $original;

    // $j saves performing the count function each time around the loop
    for ($i = 0, $j = count($chunks); $i < $j; $i++) {

        $seconds = $chunks[$i][0];
        $name = $chunks[$i][1];

        // finding the biggest chunk (if the chunk fits, break)
        if (($count = floor($since / $seconds)) != 0) {
            // DEBUG print "<!-- It's $name -->\n";
            break;
        }
    }

    $print = ($count == 1) ? '1 '.$name : "$count {$name}s";

    if ($i + 1 < $j) {
        // now getting the second item
        $seconds2 = $chunks[$i + 1][0];
        $name2 = $chunks[$i + 1][1];

        // add second item if it's greater than 0
        if (($count2 = floor(($since - ($seconds * $count)) / $seconds2)) != 0) {
            $print .= ($count2 == 1) ? ', 1 '.$name2 : ", $count2 {$name2}s";
        }
    }
    return $print;
}

echo time_since(1347216222);

?>

出力は-1 years, 12 monthsです。誰でもこれを修正するのを手伝ってもらえますか?

4

1 に答える 1

0

DateTimeとを使用するように関数を調整したためDateInterval、読みやすくなりました。

ご投稿いただいた機能とは時差の扱いが異なります。あなたの場合、値を2回テストしました(「ユニット」ごとに1回)。これには、複雑な計算が必要でした。

一方、以下の関数は、年、月DateInterval、日、時、分、秒の差をすぐに使用できるという事実を利用しています (たとえば、2015 年と 2014 年の差は 1 年と0 秒です)。 、UNIX タイムスタンプとは対照的)。さらに、 を使用DateTimeすると、タイムゾーンを適切に処理できます。

そうは言っても、気にする必要があるのはその違いをどのように出力するかだけであり、これがまさにforループの目的です。 2番目のアイテムを抽出したい。

関数は次のとおりです。

<?php
function pluralize($number, $unit) {
    return $number . ' ' . $unit . ($number !== 1 ? 's' : '');
}

function time_since(DateTime $original) {
    $now = new DateTime('now');
    $diff = $now->diff($original);

    //is from the past?
    if ($diff->invert) {
        $chunks = [
            [$diff->y, 'year'],
            [$diff->m, 'month'],
            [$diff->d, 'day'],
            [$diff->h, 'hour'],
            [$diff->i, 'minute'],
            [$diff->s, 'second'],
            [0, 'guardian'],
        ];

        for ($i = 0; $i < count($chunks) - 1; $i ++) {
            list ($value, $unit) = $chunks[$i];
            if ($value !== 0) {
                $text = pluralize($value, $unit);

                //append next unit as well, if it's available and nonzero
                list ($nextValue, $nextUnit) = $chunks[$i + 1];
                if ($nextValue !== 0) {
                    $text .= ' ' . pluralize($nextValue, $nextUnit);
                }

                return $text;
            }
        }
    }

    return 'just now';
}

そしてテスト:

echo time_since(new DateTime('2014-01-01')) . PHP_EOL;
echo time_since(new DateTime('2014-10-09')) . PHP_EOL;
echo time_since(new DateTime('2014-11-09')) . PHP_EOL;
echo time_since(new DateTime('2014-11-10')) . PHP_EOL;
echo time_since(new DateTime('2014-11-10 13:05')) . PHP_EOL;
echo time_since(new DateTime('2114-11-10 13:05')) . PHP_EOL; //future

結果:

rr-@work:~$ php test.php
10 months 9 days
1 month 1 day
1 day 13 hours
13 hours 5 minutes
38 seconds
just now
于 2014-11-10T13:15:00.693 に答える