0

時間を比較しようとしていますが、これを処理する最善の方法が完全にはわかりません。

編集できない時間の配列があります。array("500", "1100", "1700", "2300");

500 = 午前 5:00 など...

午前 6 時または午前 7 時の場合、午前 7 時かどうか、また午前 5 時または午前 10 時に近い時刻を調べるには、どのようなロジックを実行できますか?

複雑だとは思いませんが、何かを一緒にハックしようとするのではなく、まともな解決策を見つけようとしているだけです。

どんな助けや指示も大歓迎です!

4

4 に答える 4

2

Theraotのソリューションを採用して、現在の時刻までの値の距離で配列を並べ替えました。

<?php
$values = array("500", "1100", "1700", "2300");
$now = time();

/**
 *  Format an integer-string to a date-string
 */
function format($str)
{
    $length = strlen($str);
    return substr($str, 0, $length - 2).':'.substr($str, $length - 2);
}

/**
 * Callback to compare the distance to now for two entries in $values
 */
$compare = function ($timeA, $timeB) use ($now) {
    $diffA = abs($now - strtotime(format($timeA)));
    $diffB = abs($now - strtotime(format($timeB)));
    if ($diffA == $diffB) {
        return 0;
    }
    return ($diffA < $diffB) ? -1 : 1;
};

usort($values, $compare);

print_r($values);

希望する結果は$values[0]になりました。このソリューションにはphpバージョン>=5.3が必要であることに注意してください

于 2012-10-12T07:34:25.747 に答える
2

あなたが持っている配列から始めましょう:

$values = array("500", "1100", "1700", "2300");

必要なのは、有効な時間文字列にフォーマットすることです。これは簡単です。正しい位置に「:」を挿入するだけです。そのために、関数を作成しました:

function Format($str)
{
    $length = strlen($str);
    return substr($str, 0, $length - 2).':'.substr($str, $length - 2);
}

これで、 strtotimeを使用して UNIX 時間に変換できる有効な文字列を取得できます。ここでの問題は、現在の時刻に近いものを見つけることです (これはtimeで得られます) 。

したがって、配列を反復処理して変換し、現在の時刻との差を (絶対値で) 計算して、より小さな数値になるものを選択できます。コードは次のとおりです。

$now = time(); //current time
$best = false;
$bestDiff = 0;
for ($index = 0; $index < count($values); $index++)
{
    $diff = abs($now - strtotime(Format($values[$index])));
    if ($best === false || $diff < $bestDiff)
    {
        $best = $index;
        $bestDiff = $diff;
    }
}

近い時刻のインデックスを に$best、計算の瞬間との差をに残し$bestDiffます。これはすべて、これらの時間が同じ日と現地時間であると仮定していることに注意してください。

于 2012-10-12T06:35:45.067 に答える
0

これが私の解決策です:

// Input data
$values = array("500", "1100", "1700", "2300");
$time = "12:15";

// turns search time to timestamp
$search = strtotime($time);

// turns "500" to "5:00" and so on
$new = preg_replace('/^(\d?\d)(\d\d)$/','\1:\2', $values);

// converts the array to timestamp
$new = array_map('strtotime', $new);

// sorts the array (just in case)
asort($new);

// Some initialization
$distance = $closest = $result = $result_index = NULL;

// The search itself
foreach($new as $idx => $time_stamp)
{
        $distance = abs($time_stamp - $search);
        if(is_null($closest) OR $closest > $distance)
        {
                $closest = $distance;
                $result_index = $idx;
                $result = $time_stamp;

        }
}
echo "The closest to $time is ".date('H:i', $result)." ({$values[$result_index]})";
于 2012-10-12T07:24:38.550 に答える
0

2 つの時間の差の絶対値

07:00 - 05:00 = 02:00 と言いますが、02:00 の絶対値は 02:00 のままです

07:00 - 10:00 = -03:00、-03:00 の絶対値は 03:00

PHP では、strtotime を使用して時間文字列を秒に変換できます。

$time_one = strtotime("07:00");
$time_two = strtotime("05:00");
$time_three = strtotime("09:00");
于 2012-10-12T06:12:38.573 に答える