2

只是想知道如何选择最接近的变量。我有一组军事时间列表,即:0030 0100 0130 0200 等...

全部以半小时为增量。我将如何选择最接近现在的时间。例如。用户单击按钮,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

为方便起见,在您的计算中将它们视为整数,忽略前导零,因为它们对您的计算没有用处。

你有 144,你想向下舍入到 130,或 146,直到 200。类似地,14 (0014) 会变成 0 (0000),15 (0015) 会变成 30。

简单的 if/thens 就足以完成此任务。

于 2012-11-06T23:12:05.393 回答
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 回答