Как я могу поймать '02 / 31/2010 'как недопустимую дату, используя класс DateTime? - PullRequest
3 голосов
/ 15 июня 2009

Я использовал класс DateTime в PHP, потому что date () имеет недостатки обратной метки времени Unix. Однако ни один из подходов не обнаруживает недействительные даты для месяцев, у которых нет 31 дня, но при этом используется 31-й день.

Пример кода:

try {
    $date = new DateTime('02/31/2018');
    $formattedDate = $date->format('Y-m-d');
}
catch (Exception $e) {
}
echo $formattedDate;

Пример вывода:

2018-03-03

Обновление 1:

Чтобы использовать checkdate (), мне нужны составные части даты. Чтобы получить это, мне нужно создать экземпляр объекта DateTime со строкой даты в качестве конструктора. В случае '02/31/2018', он будет преобразован в '03/03/2018' при создании экземпляра. В этот момент будет слишком поздно запускать компонент месяц, день, год через checkdate (). Какое решение?

Обновление 2:

Получение составной части дат легко, если я задаю определенный формат (например, mm / dd / yyyy), но если я принимаю все форматы, принятые strtotime (), я не могу выполнить контрольную дату до запуска ее через strtotime ( ) -> date () или DateTime :: __ construct -> DateTime :: format ().

Я использовал класс DateTime в PHP, потому что date () имеет недостатки обратной метки времени Unix. Однако ни один из подходов не обнаруживает недействительные даты для месяцев, у которых нет 31 дня, но при этом используется 31-й день.

Пример кода:

try {
    $date = new DateTime('02/31/2018');
    $formattedDate = $date->format('Y-m-d');
}
catch (Exception $e) {
}
echo $formattedDate;

Пример вывода:

2018-03-03

Обновление 1:

Чтобы использовать checkdate (), мне нужны составные части даты. Чтобы получить это, мне нужно создать экземпляр объекта DateTime со строкой даты в качестве конструктора. В случае '02/31/2018', он будет преобразован в '03/03/2018' при создании экземпляра. В этот момент будет слишком поздно запускать компонент месяц, день, год через checkdate (). Какое решение?

Обновление 2:

Получение составной части дат легко, если я форсирую определенный формат (например, mm / dd / yyyy), но если я принимаю все форматы, принятые strtotime (), я не могу выполнить контрольную дату до запуска ее через strtotime ) -> date () или DateTime :: __ construct -> DateTime :: format ().

Ответы [ 3 ]

6 голосов
/ 15 июня 2009

Попробуйте функцию checkdate.

Проверяет правильность сформированной даты по аргументам. Дата считается допустимо, если каждый параметр правильно определены.

Параметры

месяц

Месяц от 1 до 12 включительно.

день

День находится в пределах допустимого количества дней для данного месяца. Внесены високосные годы рассмотрение.

год

Год от 1 до 32767 включительно.

2 голосов
/ 15 июня 2009

Расширьте DateTime и повторно реализуйте конструктор по умолчанию, чтобы использовать checkdate . Немного проще сделать это один раз и заменить все DateTime ( на MyDateTime (), чтобы вы могли добавлять дополнительные проверки по мере продвижения. Например, Год> 1940 ...

0 голосов
/ 16 июня 2009

Чтобы получить составные части даты, вы можете просто разделить строку ...

$date = explode('/','02/18/2018');

Затем используйте checkdate (), теперь, когда у вас есть компоненты.

...