Всем привет ! Недавно в проекте столкнулся с задачей - нужно было из XML даты (которая представляет собой число, равное количеству дней, прошедших с 1 января 1900 года) получить дату для записи в MySQL. Вот написал функцию, прошу комментировать, осуждать, советовать, в общем, нужны мнения: PHP: <?php /** * Converts XML format date to date of format Y.m.d * * @access private * @param int Integer, wich represents number of days past from January 1st, 1900. * @return string Date of Y.m.d format */ function _convertXML2SQLdate ($days) { $days = (int)$days; // количество дней в феврале $februaryDays = 28; // находим количество полных лет: делим на 1461 - количество дней в 4-х годах, с учётом високосного года $y = floor ($days/1461)*4; // находим остаток дней (с этих дней начнётся високосный год) $rest = $days % 1461; // если дней больше 366 - т.е. к нашим годам добавляется ещё и високосный год if ($rest/366 > 1) { $y++; $rest = $rest - 366; // теперь уже идёт учёт не високосных лет while ($rest > 365) { $y++; $rest = $rest - 365; } } else { // в случае, если текущий год - високосный - увеличиваем количество дней в феврале на 1 $februaryDays++; } // если количество оставшихся дней меньше или равно 31 - значит месяц - январь, и т.д.... // January if ($rest <= 31) { $m = 1; $d = $rest; return 1900 + $y . "." . $m . "." . $d; } // February if ($rest <= $februaryDays+31) { $m = 2; $d = $rest - 31; return 1900 + $y . "." . $m . "." . $d; } // March if ($rest <= $februaryDays+62) { $m = 3; $d = $rest - 31 - $februaryDays; return 1900 + $y . "." . $m . "." . $d; } // April if ($rest <= $februaryDays+92) { $m = 4; $d = $rest - 62 - $februaryDays; return 1900 + $y . "." . $m . "." . $d; } // May if ($rest <= $februaryDays+123) { $m = 5; $d = $rest - 92 - $februaryDays; return 1900 + $y . "." . $m . "." . $d; } // June if ($rest <= $februaryDays+153) { $m = 6; $d = $rest - 123 - $februaryDays; return 1900 + $y . "." . $m . "." . $d; } // July if ($rest <= $februaryDays+184) { $m = 7; $d = $rest - 153 - $februaryDays; return 1900 + $y . "." . $m . "." . $d; } // August if ($rest <= $februaryDays+215) { $m = 8; $d = $rest - 184 - $februaryDays; return 1900 + $y . "." . $m . "." . $d; } // September if ($rest <= $februaryDays+245) { $m = 9; $d = $rest - 215 - $februaryDays; return 1900 + $y . "." . $m . "." . $d; } // October if ($rest <= $februaryDays+276) { $m = 10; $d = $rest - 245 - $februaryDays; return 1900 + $y . "." . $m . "." . $d; } // November if ($rest <= $februaryDays+306) { $m = 11; $d = $rest - 276 - $februaryDays; return 1900 + $y . "." . $m . "." . $d; } // December if ($rest <= $februaryDays+337) { $m = 12; $d = $rest - 306 - $februaryDays; return 1900 + $y . "." . $m . "." . $d; } } ?>
PHP: <?php $datetime = new DateTime('1900-01-01 00:00:00'); date_add($datetime, new DateInterval('P366D')); echo $datetime->format('Y-m-d H:i:s'); 1901-01-02 00:00:00