Мне нужно проверить, совпадает ли строка с некоторым форматом, и я использую DateTime::createFromFormat, чтобы обеспечить его соблюдение. но в нем есть ошибки.

Например, у меня есть дата: 15.08.2020, я пытаюсь разобрать ее на объект datetime в формате «d / m / Y», затем распечатываю ее в другом формате:

   DateTime::createFromFormat("d/m/Y", '8/15/2020')->format('d-m-Y')
   // result: 08-03-2021

Это wreig, потому что я читаю в php.net https: //www.php .net / manual / en / datetime.createfromformat.php они сказали: d: день (1-> 30), m: месяц (1-> 12), Y: год (2020)

Но у меня странный результат? как это работает? или это ошибка?

Спасибо за ваш ответ.

0
Erics Nguyen 5 Июл 2021 в 07:03

3 ответа

Лучший ответ

Я думаю, что руководство по PHP неверно.

Метод DateTime :: getLastErrors () генерирует предупреждение, если диапазон для дня или месяца превышен. Вы можете это оценить. В качестве примера:

function DateTimeCreateFromStrictFormat($format, $input){
  $dt = DateTime::createFromFormat($format, $input);
  $errArr = DateTime::getLastErrors();
  return $errArr['warning_count']+$errArr['error_count'] ? false : $dt;
}
$dt = DateTimeCreateFromStrictFormat("d/m/Y", '8/15/2020');
var_dump($dt);  //bool(false)

$dt = DateTimeCreateFromStrictFormat("d/m/Y", '8/12/2020');
var_dump($dt);  //object(DateTime)#2 (3) { ["date"]=> string(26) "2020-12-08 10:34:34.000000" ..
1
jspit 5 Июл 2021 в 08:37

Ваш формат - day/month/year, но нет месяца 15, подобного даваемому 8/15/2020.

Вы имели в виду 15/8/2020?

1
brice 5 Июл 2021 в 04:10

Я пытаюсь разобрать его на объект datetime в формате «d / m / Y»

... непонятно, зачем вы так пробовали. 8/15/2020 явно означает m/d/Y. Вам нужно проанализировать его, используя формат, в котором он на самом деле написан.

Вы можете потом снова вывести его в d/m/Y - это отдельная операция.

DateTime::createFromFormat("m/d/Y", '8/15/2020')->format('d-m-Y')
1
ADyson 5 Июл 2021 в 04:13