Как рассчитать отрицательные / положительные времена и больше, чем 24:00? - PullRequest
1 голос
/ 29 апреля 2019

Я должен сделать расчет с такими временами, которые приходят из массива:

+04:43
03:33
-10:33

Я пытался использовать Datetime и прочее, но класс просто сломался, когда он превысил 24:00 (например, 10:00 + 20:00). Поэтому я попробовал что-то вроде этого:

Я преобразовал все свои чч: мм в секунды с разнесением:

foreach($stringSaldo as $saldo) {
          $horaM[] =  explode(':',$saldo);
      }
      $totalHora = 0;
      $totalMin = 0;
      foreach($horaM as $hora) {
          $totalHora = ($totalHora + $hora[0]);
          $totalMin =( $totalMin + $hora[1]);
      }
      $totalHora = $totalHora * 3600;
      $totalMin = $totalMin * 60;
      $totalSeconds = $totalHora + $totalMin;

Затем я попытался сделать эти секунды во времени:

$hours = floor($totalSeconds / 3600);
      $minutes = floor(($totalSeconds / 60) % 60);
      $seconds = $totalSeconds % 60;
 echo $hours. ":" . $minutes;

По какой-то причине, когда у меня есть такие времена, как: -03:34 и +01:00, вычисление не удается, оно дает -02:-26, но должно быть -02:34.

Что я делаю не так?

1 Ответ

0 голосов
/ 29 апреля 2019

Я думаю, что сгладил это. Важно, чтобы вы делали арифметику с абсолютными значениями и отдельно обрабатывали знак. Я включил некоторые дополнения нулями, чтобы гарантировать, что вы получаете последовательный строковый результат. Мое регулярное выражение делает + или - необязательным.

Код: ( Демонстрация ваших трех тестовых случаев )

function timeToSeconds($time) {
    if (!preg_match('~([+-]?)(\d{2}):(\d{2})~', $time, $out)) {
        echo "failed to parse $time\n";
        return 0;
    } else {
        return (($out[2] * 3600) + $out[3] * 60) * ($out[1] == '-' ? -1 : 1);
    }
}
function secondsToTime($seconds) {
    $sign = $seconds < 0 ? '-' : '';
    $abs = abs($seconds);
    return $sign . str_pad(floor($abs / 3600), 2, '0', STR_PAD_LEFT) . ':' . str_pad(floor($abs / 60 % 60), 2, '0', STR_PAD_LEFT);
}

$times = ['-03:34', '+01:00'];
$seconds = 0;
foreach ($times as $time) {
    $seconds += timeToSeconds($time);
}
echo $seconds;  // -9240
echo "\n---\n";
echo secondsToTime($seconds);  // -02:34

Соответствующий ресурс: https://stackoverflow.com/a/3856312/2943403

p.s. Когда вы делите время на :, часы могут быть положительными или отрицательными, но минуты всегда будут положительными. Это фундаментальная проблема с вашим размещенным фрагментом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...