2

最も近い変数をどのように選択するのか疑問に思っています。軍事時間のセットリストがあります。つまり、0030 0100 0130 0200 など...

すべて30分単位で。現在に最も近い時間をどのように選択しますか。例えば。ユーザーがボタンをクリックすると、php は現在の時刻を取得し、最も近い時刻変数を選択します。0144 の場合は 0130 を選択し、0146 の場合は 0200 を選択します。

4

4 に答える 4

3

時刻は常に 30 分間隔で保存されるため、30 から現在時刻の下 2 桁 (分) を引きます。

例: 現在時刻が 0146 の場合、

  1. ストリップ アウト 46 (分)
  2. 30から絶対差をとる
  3. 差が 15 より大きい場合は、0146 (ここでは 0200) の次の利用可能なタイム スロットを使用します。
  4. 差が 15 以下の場合は、0146 (ここでは 0130) より前の利用可能な時間を取ります。

お役に立てれば。

于 2012-11-06T23:09:33.100 に答える
0

私はこれがそれを行うべきだと信じています:

function military_time() {
    $hour = (int) date('G');
    $minute = (int) date('i');

    $rounded_minute = round($minute / 30);

    switch ($rounded_minute) {
        case 0:
            $minute = '00';
            break;
        case 1:
            $minute = '30';
            break;
        case 2:
            $minute = '00';
            $hour = (int) $hour + 1;
            break;
    }

    // 2400 should become 0000
    if ($hour > 23) $hour = 0;

    // leading zero
    if ($hour < 10) $hour = '0' . $hour;

    return $hour . $minute;
}

echo military_time();

おそらく改善される可能性があります。

于 2012-11-06T23:23:15.577 に答える
0

あなたが試すことができます

$times = array("0030","0100","0130","0200");

echo "<pre>";
echo militaryTime($times, "0020"), PHP_EOL;
echo militaryTime($times, "0050"), PHP_EOL;
echo militaryTime($times, "0144"), PHP_EOL;
echo militaryTime($times, "0146"), PHP_EOL;
echo militaryTime($times, "0220"), PHP_EOL;

出力

0030
0100
0130
0200
0200

使用する機能

function militaryTime($times, $selected) {
    if (empty($times))
        trigger_error("Empty array not supported ");
    $times[] = $selected;
    sort($times);
    $position = array_search($selected, $times, true);
    $current = DateTime::createFromFormat("Hi", $times[$position]);
    $previous = isset($times[$position - 1]) ? DateTime::createFromFormat("Hi", $times[$position - 1]) : null;
    $next = isset($times[$position + 1]) ? DateTime::createFromFormat("Hi", $times[$position + 1]) : null;

    if ($previous != null && $next == null) {
        return $previous->format("Hi");
    }
    if ($previous == null && $next != null) {
        return $next->format("Hi");
    }

    $closest = ($current->diff($previous)->format("%i") - $current->diff($next)->format("%i") <= 0) ? $previous : $next;
    return $closest->format("Hi");
}
于 2012-11-06T23:58:34.300 に答える
0

簡単にするために、計算ではそれらを整数として扱い、先頭のゼロは計算に役立たないため無視します。

144 があり、130 に切り捨てるか、146 を切り捨てて 200 にします。同様に、14 (0014) は 0 (0000) になり、15 (0015) は 30 になります。

これを完了するには、単純な if/then で十分です。

于 2012-11-06T23:12:05.393 に答える