Респектабельный парсер PHP Datetime
echo date('r',strtotime("16 Dec, 2010")); //Tue, 16 Dec 2008 20:10:00 +0530
echo date('r',strtotime("16 Dec 2010")); //Sat, 16 Jan 2010 00:00:00 +0530
Это просто неправильно... Либо он должен потерпеть неудачу, либо он должен правильно разобрать. Знаете ли вы какой-нибудь надежный парсер даты / времени на естественном языке в php? Как вы разбираете дату на естественном языке в php?
Редактировать:
var_dump(strtotime("16 Dec, abcd")); //bool(false)
"16 декабря 2010" является допустимым форматом ввода даты GNU или нет. В первом случае он должен вернуть правильный ответ, а во втором - false. Это то, что я имею в виду под "неправильно".
Редактировать:
Как и предполагалось, цель состоит в том, чтобы принять значительное разнообразие пользовательского ввода.
5 ответов
Если вы знаете, в каком формате время представлено в строке, вы можете использовать strptime()
вместе с соответствующей строкой формата для ее анализа. По крайней мере, он сообщит об ошибке, когда не сможет интерпретировать строку в соответствии с форматом.
Эта функция существует в PHP 5.1.0 и выше.
Если вы хотите получить произвольный пользовательский ввод, вы должны предложить пользователю четкую и очевидную обратную связь, чтобы он мог что-то сделать с неверно истолкованной датой. В большинстве случаев проблем не будет, и вы не сможете отследить все проблемные случаи (например, американский или европейский формат).
Существует класс Ruby под названием Chronic, который обладает гибкостью, необходимой для удобного пользовательского ввода: http://chronic.rubyforge.org/
Я уверен, что вы можете просто перенести его на PHP, заменив Ruby's Time на PHP DateTime.
Это не так, данные, которые вы предоставляете, неоднозначны - существует большая разница.
Неоднозначные данные означают, что максимум, на что вы можете разумно рассчитывать, это "лучшая догадка". Вы можете не согласиться с тем, как он делает это лучшее предположение, но это не "неправильно", это просто другое мнение о том, что наиболее вероятно. Вы не можете ожидать больше, чем это, не устраняя двусмысленность.
Дальнейшие мысли, в основном комментарии Хопа к OP:
Молчаливый провал - это не вариант - решение, когда молчать или не молчать, подчиняется тем же правилам и будет выброшено из-за той же неясности.
Какая из строк примера неверна и должна молча провалиться? Что насчет парня рядом с тобой? Он думает, что то же самое не так? Что если вы удалите контекст, не сравнивая их рядом?
Единственное, что здесь "неправильно", - это ожидание, что функция сможет расшифровать точное значение из данных, которые всегда будут подвергаться неоднозначности... и это только те примеры, с которыми я еще даже не дошел до дат:) (1/2/08 - это первое февраля или 2 января? 1908? 2008? 8?)
Правильно, я сказал, что написать функцию is_this_art'...
Я не знаком ни с кем, хотя, возможно, кто-то может предложить уже написанное. В то же время, я бы порекомендовал пропустить ваши данные даты через регулярное выражение или другой метод, прежде чем помещать их в strtotime, и использовать небольшую проверку работоспособности на выходе, чтобы увидеть, попадает ли возвращаемая дата в допустимый диапазон.
strtotime - лучшая функция, которую вы можете найти для этого. Я сомневаюсь, что произвольное строковое представление даты когда-либо будет интерпретировано на 100% правильно, поскольку для этого потребуется хотя бы некоторая информация об используемом форматировании.
Другими словами: пожалуйста, определите естественный язык (вы только что использовали две его версии в своем вопросе, как правильно указал интерпретатор php)