Можно как-то сделать рефакторинг данного кода?

То есть в переменную $time попадает строке в формате '01:30' типо такого. Дальше в конструкторе она делиться на
array (size=2)
  0 => 
    array (size=2)
      0 => int 0
      1 => int 1
  1 => 
    array (size=2)
      0 => int 3
      1 => int 0

class TimeModel
{
    private $hour1;
    private $hour2;
    private $minut1;
    private $minut2;

    /**
     * Переводиться в формате ММ:СС
     * TimeModel constructor.
     *
     * @param string $time
     */
    public function __construct(string $time)
    {
        if ($time[0] == '0'){
            $time = substr($time, 1);
        }
        $arDate = preg_split('/:/', $time);
        $this->hour1 = (int)$arDate[0][0];
        $this->hour2 = (int)$arDate[0][1] ?? null;
        $this->minut1 = (int)$arDate[1][0];
        $this->minut2 = (int)$arDate[1][1];
    }

    /**
     * Округление времени до пяти минут
     * @return string
     */
    public function getRounding() :string
    {
        $arTime = [];

        $arTime[0][0] = $this->hour1;
        $arTime[0][1] = $this->hour2;
        $arTime[1][0] = $this->minut1;
        $arTime[1][1] = $this->minut2;


        if ($this->minut2 >= 1 && $this->minut2 <= 4){
            $arTime[1][1] = 5;
        } else if ($this->minut2 >= 6 && $this->minut2 <= 9){
            if ($this->minut1 < 5) {
                $arTime[1][0] = $this->minut1 + 1;
            } else {
                if ($this->minut1 >= 5) {
                    if (!$this->hour2) {
                        if ($this->hour1 == 9){
                            $arTime[0][1] = 0;
                        }
                        $arTime[0][0] = $this->hour1 + 1;
                    } else {
                        if ($this->hour2 < 9){
                            $arTime[0][1] = $this->hour2 + 1;
                        } else {
                            $arTime[0][0] = 1;
                            $arTime[0][1] = 0;
                        }
                    }
                    $arTime[1][0] = 0;
                } else {
                    $arTime[0][1] = $this->minut1 + 1;
                    $arTime[1][0] = 0;
                }
            }
            $arTime[1][1] = 0;
        }

        return $arTime[0][0].$arTime[0][1].':'.$arTime[1][0].$arTime[1][1];
    }

}

метод getRounding мне кажется что он слишком большой, но пока что не пойму как можно его сократить.
Сам метод getRounding округляет цифру до 5 минут. Допустим, чтобы было не "14:01", а "14:00", не "7:23", а "7:25"
И возможно ли вообще его сократить?
  • Вопрос задан
  • 111 просмотров
Пригласить эксперта
Ответы на вопрос 1
@AlexndrNovikov
Solution Architect in Spiral Scout
Если я правильно понял этот пахучий код - то это должно быть его полным эквивалентом
Округление в большую сторону до 5 минут/секунд

class TimeModel
{
    private $time;

    /**
     * Time in HH:MM format
     * TimeModel constructor.
     *
     * @param string $time
     */
    public function __construct(string $time)
    {
        $this->time = \DateTime::createFromFormat('H:i', $time);
    }

    /**
     * Округление времени до пяти минут
     * @return string
     */
    public function getRounding(): string
    {
        $nextFiveMinutesRound = ceil($this->time->getTimestamp() / 300) * 300;
        return (\DateTime::createFromFormat('U', $nextFive))->format('H:i');
    }

}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы