Использование DateTime :: createFromFormat () без переноса (неправильной) даты - PullRequest
0 голосов
/ 16 ноября 2018

Пусть неправильная дата 58/57/5654 (или 58.57.5654) написана в языковой части набора языков, на которых даты не пишутся одинаково ( например: французские даты, английские датыи немецкие даты).Я хочу позвонить по номеру DateTime::createFromFormat(), передав языковой формат даты и эту неправильную дату, чтобы получить неправильный (или правильный) день, месяц и год в соответствии с языком.

Пример.

  1. Французский пользователь написал 58/57/5654 (или 58.57.5654).Поэтому я хочу получить: (day, month, year) = (58, 57, 5654)

  2. Английский пользователь написал эту же дату.Я получу: (day, month, year) = (57, 58, 5654).

  3. А для немца это будет то же самое, что и для французского.

Проблема

Использование, DateTime::createFromFormat($the_format, $the_date); выполнит бросок на значения дня, месяца и года, если заданные значения неверны.Например: string(10) "58/57/5654" становится правильным, , но нежелательным , дата string(10) "28/10/5658".

Как мне избежать этого броска?

См .: https://secure.php.net/manual/fr/datetime.createfromformat.php

1 Ответ

0 голосов
/ 16 ноября 2018

Я не уверен, что возможно отключить эту функцию, но вы можете проверить , если это произошло:

$date = \DateTimeImmutable::createFromFormat($format, $dateString);

if(!$date || ($date->format($format) !== $dateString)) {
    throw new InvalidDateException($dateString);
}

То, что мы делаем здесь, проверяет предоставленную строку даты по дате, которая была создана из этой строки даты, это укажет нам, произошло ли, как вы выразились, «опрокидывание».

Это потребует некоторой адаптации для работы с вашей базой кода, но, надеюсь, что даст вам общий подход к работе?

...