Как правильно конвертировать дни в дату с фиксированным количеством дней в месяце?

Последнее время тренируюсь в ООП и нашел такую задачу. Не уверен в правильности решения поэтому прошу помощи.

Добрый день, есть задача конвертера земного времени. Где то во вселенной болтается планета NN на которой сутки равны 24 часам (как и на земле), но дней в месяце 25 а месяцев в году 16. Нужно написать конвертер дат между планетой земля и планетой NN. В оригинале таких планет в задаче 5 но они отличаются лишь количеством месяцев в году и количеством дней в месяце.

На выходе нужно получить что то типа: Земля yyyy-mm-dd и NN: yyyy-mm-dd

Получается что земной день - это минимальная неделимая единица(она же день на планете NN)

По факту я вижу тут класс для земли и класс для всех остальных планет в которым просто будут свои getter и setter (чтобы задать количество месяцев в году и дней в месяце)

В классе земли 2 метода

// Получаю количество дней от начала времен :)
  public function getAmountDaysByDate ($date) {
        $startDate = new DateTime("0001-01-01");
        $currentDate = new DateTime($date);
        $interval = $startDate->diff($currentDate);
        return $interval->days;
    }
  // Получаю дату по количеству дней от начала времен
    public function calculateDateByDays ($days) {
        $startDate = '0001-01-01';
        $date = new DateTime($startDate);
        $date->add(new DateInterval('P'.$days.'D'));
        $currentDate = $date->format('Y-m-d');
        return $currentDate;
    }


В целом все понятно, есть 2 метода. Первый возвращает количество дней между датами и второй возвращает дату по количеству дней от начала.

Но вот для NN планеты начинается проблема, возможно я что-то не правильно считаю.

public $month = 16;
    public $days = 25;
    // Так как у меня большие проблемы с алгоритмами, лучше способа чем округлять дробь в меньшую сторону и отнимать от первоначального значения я не нашел... ( можно было использовать intdiv )
    public function getCurrentDateByDays($days)
    {
        $currentYear = floor ($days / ($this->month*$this->days));
        $daysMonth = $days - $currentYear*$this->month*$this->days;
        $currentMonth = floor ($daysMonth/$this->days);
        $currentDays = $daysMonth - $currentMonth*$this->days;
        return str_pad($currentYear+1, 4, '0', STR_PAD_LEFT).'-'.str_pad($currentMonth+1, 2, '0', STR_PAD_LEFT).'-'.str_pad($currentDays+1, 2, '0', STR_PAD_LEFT);
    }
 
   // А это наверняка можно решить более красиво чем отнимать 1
    public function getDaysByCurrentDate($date)
    {
        list($year, $month, $day) = explode("-", $date);
        $days = ($year - 1) * $this->month * $this->days + ($month - 1) * $this->days + $day;
        return $days;
    }


Так вот к чему я, когда я посчитал первые несколько лет в exel ответы начали немного отличаться (возможно проблемы с нашим земным календарем т.к. хз как это считается в недрах php например 0002-01-01 и учитывает ли он високосный год и с какого временного промежутка)
Но скорее все я напутал в методе getCurrentDateByDays
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы