Только создатель кода класса DateTime может полностью ответить на вопрос.Я просто пытаюсь объяснить мотивацию.DateTime хочет интерпретировать многие из возможных бесплатных форматов.Сначала входные данные преобразуются в строку.
class test{
public function __toString(){
return "2001-02-03 04:05:06";
}
}
$d = new DateTime(new test);
//object(DateTime)#2 (3) { ["date"]=> string(19) "2001-02-03 04:05:06" ["timezone_type"]=> int(3) ["timezone"]=> string(13) "Europe/Berlin" }
Используемый здесь метод __toString подтверждает это.Если строка пуста, то генерируется дата из текущего дня и текущего времени.Это также основа для недостающей информации из входных данных.Затем пытается распознать время ( Форматы времени ).
Этот тест показывает, что первая попытка состоит в определении времени.Посмотрите на следующие тесты или подтверждение.Это описано в руководстве Форматы даты :
Год (и только год) YY "1978", "2008"
'1978«не может быть времени, поэтому он анализируется как год.
var_dump(new DateTime('1978')); //"1978-09-23 09:46:43.000000"
Но« 2008 »может представлять время.Он анализируется как время 20: 08.
var_dump(new DateTime('2008')); // "2019-09-23 20:08:00.000000"
Часы, минуты и секунды могут быть изменены с помощью: ,,.или ничего не должно быть отделено.Если обнаружен только один раз, то текущий день принимается за дату.Примеры (сегодня 23 сентября 2019 г.):
'04:08','0408','04.08' => "2019-09-23 04:08:00.000000"
'04.08.05','04.08:05','040805' => "2019-09-23 04:08:05.000000"
Затем выполняется попытка анализа даты.Порядок Дата / Время или Время Дата на входе не имеет значения.Все строки анализируются на "2001-02-03 04: 05: 00.000000":
'04:05 2001-02-03'
'04.05 20010203'
'04.0520010203'
'4.0520010203'
'2001020304.05'
'20010203 04.05'
Ваша строка: '5.123456'
Сначала анализатор анализирует 5.12 как время 05:12.Остальное «3456» в году.
Строка «5.12345678901232004» будет проанализирована как «5.12 34567890123 2004» 5.12, как время 05:12 и 2004 как год.
var_dump(new DateTime('5.12 34567890123 2004'));
//object(DateTime)#2 (3) { ["date"]=> string(26) "2004-05-02 05:12:00.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(13) "Europe/Berlin" }
У меня естьне знаю, как определить оставшуюся строку '34567890123' день 02 и месяц 05.
На вопрос не ответили полностью.Я надеюсь, что внес вклад в понимание синтаксического анализатора DateTime.