Не уверен, что весь процесс является лучшим способом достижения того, чего вы хотите, но это проблема (я думаю).
Просто использование минутного кода в качестве примера ...
public function addMinutes(int $addedMinutes): void {
$newMinutes = $this->minute + $addedMinutes;
if($newMinutes >= 60) {
$hours = round($newMinutes / 60, 0, PHP_ROUND_HALF_DOWN);
$this->addHours($hours);
}
$this->minute += $newMinutes % 60;
}
Итак, сначала вы добавляете новые минуты к существующему времени ...
$newMinutes = $this->minute + $addedMinutes;
обрабатываете переход на другой час, а затем вы снова добавляете новое поле минут ...
$this->minute += $newMinutes % 60;
Это повторяется на каждом слое.
Поэтому я предлагаю что-то вроде
public function addMinutes(int $addedMinutes): void {
$newMinutes = $this->minute + $addedMinutes;
if($newMinutes >= 60) {
$hours = floor($newMinutes / 60);
$this->addHours($hours);
$newMinutes -= ($hours * 60);
}
$this->minute = $newMinutes;
}
Это выполняет аналогичную обработку, но последняя часть просто назначает новые минуты, а не добавляет ихснова.
Обратите внимание, что я также изменил способ вычисления следующего уровня - используя floor()
вместо round()
.