只是想知道如何选择最接近的变量。我有一组军事时间列表,即:0030 0100 0130 0200 等...
全部以半小时为增量。我将如何选择最接近现在的时间。例如。用户单击按钮,php 获取现在的时间,并选择最接近的时间变量。因此,如果是 0144,它将选择 0130。如果是 0146,它将选择 0200。
只是想知道如何选择最接近的变量。我有一组军事时间列表,即:0030 0100 0130 0200 等...
全部以半小时为增量。我将如何选择最接近现在的时间。例如。用户单击按钮,php 获取现在的时间,并选择最接近的时间变量。因此,如果是 0144,它将选择 0130。如果是 0146,它将选择 0200。
由于您始终以 30 分钟的间隔存储时间,因此从 30 中减去当前时间的最后 2 位(分钟)。
例如:如果当前时间是 0146,
希望这可以帮助。
为方便起见,在您的计算中将它们视为整数,忽略前导零,因为它们对您的计算没有用处。
你有 144,你想向下舍入到 130,或 146,直到 200。类似地,14 (0014) 会变成 0 (0000),15 (0015) 会变成 30。
简单的 if/thens 就足以完成此任务。
我相信这应该这样做:
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();
不过可能会有所改进。
你可以试试
$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");
}