2016-10-14 2 views
1

私はLaravel 5.3とCarbonライブラリを使用しています。Carbon:compare diffForHumans

私は複数のdiffForHumansの結果を比較しようとしています。例えば

私は3つの違いがあります

3 weeks after

7 days after

2 days after

は最小値、最大値、平均値を見つけるために、これらを比較することは可能ですか?

だろう。この例では

:必要に応じて、私はdiffの代わりdiffForHumansを使用することができ、10日

  • 分:2日
  • 最大:3週間
  • 平均(それは平均的には正確な結果が得られるように思えます)。

    私はこのトピックで何かを見つけることができないので、あまりにもGoogleに感謝しているので、私は間違ったことを探していると思います。

    ありがとうございます!

答えて

1

diffForHumansからの出力は、人間と人間にとっては、われわれのようにひどい電卓です。それをしないでください。次のように\Carbonの配列を考えると

、あなたの値を計算することができます

$carbons = [ ... ]; 
$diffs = array_map(function ($c) { return $c->diffInSeconds(); }, $carbons); 
$max = $carbons[array_search(max($diffs), $diffs)]; 
$min = $carbons[array_search(min($diffs), $diffs)]; 
$avg = array_sum($diffs)/count($diffs); 

あなたが主張する、とdiffForHumansからの出力をソートしたい場合は、修正や数値のOFFキーことができます。一度注文した、あなたは分をシフトとmaxを開くことができます:

function score($c) { 
    $scores = [ 1 => 'second', 'minute', 'hour', 'day', 'week', 'month', 'year' ]; 
    $diff = $c->diffForHumans(); 
    foreach ($scores as $multiplier => $word) { 
     if (false !== strpos($diff, $word)) { 
      return $multiplier * (int)$diff; 
     } 
    } 
    return (int)$diff; 
} 
usort(
    $carbons, 
    function ($a, $b) { return score($a) <=> score($b); } 
); 

クマを念頭にdiffForHumans出力は、短い形式(例えば、'd'代わりの'day')だけでなく、他の言語に翻訳することができます。だから、その出力を操作するのには注意が必要です。

注:上記のコードは精神的にのみコンパイルされています。

+0

だから根本的に、 'diffInSeconds'を使ってそれらを比較してみましょうか?シンプルで実用的な欠陥は見えません。あなたは私が実装しようとした回避策を信じていないだろう...明日それを試してみるだろうが、それはおそらく、うまくいくはずです!そして1つの修辞的な質問:なぜこれに似た何かがCarbonに実装されていないのですか? – dbr

+0

私はCarbonがこの能力を欠いていると考えています。なぜなら、Carbonは基本的にはtime *のインスタンスであるのに対し、あなたが望む操作はtime *のインスタンスを収集しているからです。 – bishop

関連する問題