PHP: парсинг даты любого формата (особенно: 2008-10-20, 2008/10/20, 2008.10.20, 20 ноября 2008 г.) - PullRequest
4 голосов
/ 16 июля 2010

strtotime("25/03/1957") возвращает false.что удовлетворит все эти форматы даты?я не могу себе представить, сколько времени понадобится, чтобы на самом деле сделать свой собственный, поэтому я надеюсь, что уже есть один, о котором вы знаете.

спасибо!

Ответы [ 2 ]

2 голосов
/ 16 июля 2010

Учитывая, что некоторые даты действительны, но могут указывать на две разные фактические даты, ни одна функция никогда не сможет "угадать" правильный формат в любое время ...

Чтобы помочь с этим, с PHP> = 5.3 была добавлена ​​новая функция: date_create_from_format - но она не существует с PHP
(См. Также DateTime::createFromFormat)


Тем не менее, в приведенном вами примере возможный источник проблем - 1957 год: PHP обычно работает с метками времени UNIX , когда дело доходит до дат ...

И, по крайней мере, в 32-битных системах, они могут представлять даты только между 1970 и 2038 - так как они подсчитывают количество секунд с 1970-01-01.

Чтобы избежать этой проблемы, часто рекомендуется использовать класс DateTime, с которым ( цитируем ) :

Информация о дате и времени внутренне хранится как 64-битное число так что все мыслимые даты (в том числе отрицательные годы) поддерживаются. диапазон составляет около 292 миллиардов лет в прошлом к ​​тому же в будущем.

(Это не решит проблемы с синтаксическим анализом в PHP <5.3; но решит проблему с диапазоном дат ...) </em>

1 голос
/ 16 июля 2010

Я обнаружил, что объекты dateTime поддерживают более широкий диапазон форматов, чем функция strtotime (), и настройки часового пояса вашего сервера также имеют значение;но в итоге я создал функцию, которая заменила бы '/' на '-', прежде чем использовать методы string to date.Я также проверяю правильность, затем попробуйте поменять местами дд и мм (25-03-2001 => 03-25-2001), если они недействительны, перед повторным тестированием.

...