0

特定の秒数が与えられたときに、人間が読める経過時間を計算する最もエレガントな方法は何だろうと思っています。これをPHPで書きたいと思います。

必要な出力は次のとおりです。

  • 経過時間InSeconds > 1年、出力「#年、#ヶ月」
  • lapsedTimeInSeconds > 1 か月、出力 "# か月、# 日"
  • 経過時間InSeconds > 1 日、「# 日、# 時間」を出力
  • 経過時間InSeconds > 1時間、出力「#時間、#分」
  • 経過時間InSeconds > 1分、出力「#分、#秒」

ぎこちなく条件付きステートメントでいっぱいのさまざまなソリューションを試しましたが、より再帰的で「クリーンなコード」の方法を望んでいました。

4

3 に答える 3

2

ご提案ありがとうございます。

私は主にWaygoodとChrisForrenceの提案をこの方法に使用しました。私はそれをできるだけ単純に保つように努め、詳細レベルや区切り文字(文字列出力用)などの単純な引数を導入しました。

public function elapsedTimeHumanReadable($date = null, $detailLevel = 2, $delimiter = ' et ')
{
    if($date === null)
    {
        $date = self::now();
    }

    $sec = $this->elapsedSecond($date);

    $a_sec = 1;
    $a_min = $a_sec * 60;
    $an_hour = $a_min * 60;
    $a_day = $an_hour * 24;
    $a_month = $a_day * 30;
    $a_year = $a_day * 365;

    $text = '';
    $resultStack = array();
    if($sec >= $a_year)
    {
        $years = floor($sec / $a_year);
        $text .= $years . $this->plural($years, ' an');
        $sec = $sec - ($years * $a_year);
        array_push($resultStack, $text);
    }

    if($sec >= $a_month)
    {
        $months = floor($sec / $a_month);
        $text = $months . ' mois';
        $sec = $sec - ($months * $a_month);
        array_push($resultStack, $text);
    }

    if($sec >= $a_day)
    {
        $days = floor($sec / $a_day);
        $text = $days . $this->plural($days, ' jour');
        $sec = $sec - ($days * $a_day);
        array_push($resultStack, $text);
    }

    if($sec >= $an_hour)
    {
        $hours = floor($sec / $an_hour);
        $text = $hours . $this->plural($hours, ' heure');
        $sec = $sec - ($hours * $an_hour);
        array_push($resultStack, $text);
    }

    if($sec >= $a_min)
    {
        $minutes = floor($sec / $a_min);
        $text = $minutes . $this->plural($minutes, ' minute');
        $sec = $sec - ($minutes * $a_min);
        array_push($resultStack, $text);
    }

    if($sec >= $a_sec)
    {
        $seconds = floor($sec / $a_sec);
        $text = $sec . $this->plural($seconds, ' seconde');
        $sec = $sec - ($sec * $a_sec);
        array_push($resultStack, $text);
    }

    $result = $resultStack[0];
    for($i = 1; $i <= $detailLevel - 1; $i++)
    {
        if(!empty($resultStack[$i]))
        {
            $result .= $delimiter . $resultStack[$i];
        }
    }

    return $result;
}

また、時間単位を正しい文法で返すための非常に単純な複数形関数を追加しました。

public function plural($value, $unit)
{
    if($value > 1)
    {
        return $unit . 's';
    }
    else
    {
        return $unit;
    }
}

forループにはあまり満足していませんが、実際には正常に機能します。

とにかく、助けてくれてありがとう!

于 2013-03-21T15:34:44.933 に答える
1

私はこれを使用します:

function durationFormat($time)
{
    if(gmdate("Y", $time)>1970) return (1970-gmdate("Y",$time)).gmdate(" \y\r\s ", $time).(gmdate("n",$time)-1).gmdate(" \m\o\n\t\h\s ", $time).(gmdate("j",$time)-1).gmdate(" \d\a\y\s H:i:s", $time);
    if(gmdate("n", $time)>1) return (gmdate("n",$time)-1).gmdate(" \m\o\n\t\h\s ", $time).(gmdate("j",$time)-1).gmdate(" \d\a\y\s H:i:s", $time);
    if(gmdate("j", $time)>1) return (gmdate("j",$time)-1).gmdate(" \d\a\y\s H:i:s", $time);
    return gmdate("H:i:s", $time);
}

少し速くて汚いですが、仕事はします

また

function durationFormat2($seconds)
{
    $a_sec=1;
    $a_min=$a_sec*60;
    $an_hour=$a_min*60;
    $a_day=$an_hour*24;
    $a_week=$a_day*52;
    //$a_month=$a_day*(floor(365/12));
    $a_month=$a_day*30;
    $a_year=$a_day*365;

    $params=2;
    $text='';
    if($seconds>$a_year)
    {
        $years=floor($seconds/$a_year);
        $text.=$years.' years ';
        $seconds=$seconds-($years*$a_year);
        $params--;
    }
    if($params==0) return $text;
    if($seconds>$a_month)
    {
        $months=floor($seconds/$a_month);
        $text.=$months.' months ';
        $seconds=$seconds-($months*$a_month);
        $params--;
    }
    if($params==0) return $text;
    if($seconds>$a_week)
    {
        $weeks=floor($seconds/$a_week);
        $text.=$weeks.' weeks ';
        $seconds=$seconds-($months*$a_week);
        $params--;
    }
    if($params==0) return $text;
    if($seconds>$a_day)
    {
        $days=floor($seconds/$a_day);
        $text.=$days.' days ';
        $seconds=$seconds-($days*$a_day);
        $params--;
    }
    if($params==0) return $text;
    $H=gmdate("H", $seconds);
    if($H>0)
    {
        $text.=$H.' hours ';
        $params--;
    }
    if($params==0) return $text;
    $M=gmdate("i", $seconds);
    if($M>0)
    {
        $text.=$M.' minutes ';
        $params--;
    }
    if($params==0) return $text;
    $S=gmdate("s", $seconds);
    $text.=$S.' seconds ';

    return $text;
}
于 2013-03-21T13:25:36.170 に答える