Последнее время тренируюсь в ООП и нашел такую задачу. Не уверен в правильности решения поэтому прошу помощи.
Добрый день, есть задача конвертера земного времени. Где то во вселенной болтается планета 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