最も近い変数をどのように選択するのか疑問に思っています。軍事時間のセットリストがあります。つまり、0030 0100 0130 0200 など...
すべて30分単位で。現在に最も近い時間をどのように選択しますか。例えば。ユーザーがボタンをクリックすると、php は現在の時刻を取得し、最も近い時刻変数を選択します。0144 の場合は 0130 を選択し、0146 の場合は 0200 を選択します。
最も近い変数をどのように選択するのか疑問に思っています。軍事時間のセットリストがあります。つまり、0030 0100 0130 0200 など...
すべて30分単位で。現在に最も近い時間をどのように選択しますか。例えば。ユーザーがボタンをクリックすると、php は現在の時刻を取得し、最も近い時刻変数を選択します。0144 の場合は 0130 を選択し、0146 の場合は 0200 を選択します。
時刻は常に 30 分間隔で保存されるため、30 から現在時刻の下 2 桁 (分) を引きます。
例: 現在時刻が 0146 の場合、
お役に立てれば。
私はこれがそれを行うべきだと信じています:
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");
}
簡単にするために、計算ではそれらを整数として扱い、先頭のゼロは計算に役立たないため無視します。
144 があり、130 に切り捨てるか、146 を切り捨てて 200 にします。同様に、14 (0014) は 0 (0000) になり、15 (0015) は 30 になります。
これを完了するには、単純な if/then で十分です。