Учитывая десятичное значение времени, как я могу округлить это до интервала? - PullRequest
1 голос
/ 27 января 2012

Например, учитывая десятичное значение 5,66, представляющее 5 часов и 39 минут, как бы я округлил это число до 5 часов и 45 минут (ближайший 15-минутный интервал), или 5,75.

Точно так же, если бы у меня было 5 часов 36 минут или 5,6, это ближе к 5:30, чем 5:45, поэтому я бы хотел получить 5,5.

Попытка написать это на PHP.

function round_decimal_time($time, $interval=15){
  // Split up decimal time
  $hours = (int) $time;
  $minutes = $time - $hours;

  // Convert base 10 minutes to base 60 minutes
  $b60_m = $minutes * 60;

  // Round base 60 minutes to nearest interval... (15 minutes by default)
  // DONT KNOW HOW TO DO THIS PART

  // If greater than or equal to 60, go up an hour
  if($b60_m >= 60){
      $hours += 1;
      $minutes = 0;
  } else {
    // Otherwise, convert b60 minutes back into b10
    $time = $hours + ($b60_m / 60);
  }

  return $time;
}

И снова несколько примеров того, что я пытаюсь сделать.

Input: 5.66 (5:39 duration)
Output: 5.75

Input: 5.6 (5:36 duration)
Output: 5.50

Input: 5.05 (5:03 duration)
Output: 5.00

Ответы [ 3 ]

3 голосов
/ 27 января 2012

Округление до 'nearest number $X' выполняется:

 round($number/$X)*$X;

Итак, после (0,66 * 60 = 39,6):

 round(39.6/15)*15=45

Вы можете использовать ceil и floor аналогичным образом, если вы всегда хотите округлить или увеличить.

Ваша общая функция будет:

 round_decimal_time($time,$round=15){
     return (round($time * 60 / $round) * $round) / 60;
 }
1 голос
/ 27 января 2012
$a = 5.66;
var_dump(round($a / 0.25) * 0.25);

И такой подход верен для любого округления.

Например: если у вас было 7 и вы хотите округлить до ближайшего числа, которое делится на 5 (5, 10, 15, 20 и т. Д.) вы могли бы сделать:

round(7 / 5) * 5
0 голосов
/ 27 января 2012

Чтобы округлить что-либо до ближайшего x, разделите на x, округлите до ближайшего целого числа, затем умножьте на x.

...