Респектабельный синтаксический анализатор PHP Datetime - PullRequest
3 голосов
/ 18 декабря 2008
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?

Edit:

var_dump(strtotime("16 Dec, abcd")); //bool(false)

«16 декабря 2010» - это допустимый формат ввода даты GNU или нет. В первом случае он должен вернуть правильный ответ, а во втором - false. Это то, что я имею в виду под «неправильно».

Edit:

Целью является, как и предполагалось, принятие значительного разнообразия пользовательского ввода.

Ответы [ 5 ]

2 голосов
/ 18 декабря 2008

Если вы знаете, в каком формате время представлено в строке, вы можете использовать strptime() вместе с соответствующей строкой формата для его анализа. По крайней мере, он сообщит об ошибке, когда не сможет интерпретировать строку в соответствии с форматом.

Эта функция существует в PHP 5.1.0 и выше.

Если вы хотите получить произвольный пользовательский ввод, вы должны предложить пользователю четкую и очевидную обратную связь, чтобы он мог что-то сделать с неверно истолкованной датой. В большинстве случаев проблем не будет, и вы никогда не сможете уловить все проблемные случаи (например, американский или европейский формат).

1 голос
/ 09 октября 2009

Существует класс Ruby под названием Chronic, который обладает гибкостью, необходимой для удобного пользовательского ввода: http://chronic.rubyforge.org/

Я уверен, что вы можете просто перенести его на PHP, заменив Ruby's Time на PHP DateTime.

1 голос
/ 18 декабря 2008

Это не так, данные, которые вы предоставляете, неоднозначны - существует большая разница.

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

Дальнейшие мысли, в основном комментарии Хопа к OP:

Неудачный отказ не возможен - решение, когда или не отказывать молча, подчиняется тем же правилам и будет выброшено из-за той же неопределенности.

Какая из строк в примере неверна и должна молча провалиться? Что насчет парня рядом с тобой? Он думает, что то же самое не так? Что если вы удалите контекст, не сравнивая их рядом?

Единственное, что здесь «неправильно», - это ожидание того, что функция сможет расшифровать точное значение из данных, которые всегда будут подвергаться неоднозначности ... и это только те примеры, которые я до сих пор даже не получил :) (1/2/08 - первое февраля или 2 января? 1908? 2008? 8?)

Правильно, я сказал, что написать функцию is_this_art '...

0 голосов
/ 18 декабря 2008

Я не знаком ни с кем, хотя, возможно, кто-то может предложить уже написанное. В то же время, я бы порекомендовал пропустить ваши данные даты через регулярное выражение или другой метод, прежде чем помещать их в strtotime, и использовать небольшую проверку работоспособности на выходе, чтобы увидеть, попадает ли возвращаемая дата в допустимый диапазон.

0 голосов
/ 18 декабря 2008

strtotime - лучшая функция, которую вы можете найти для этого. Я сомневаюсь, что произвольное строковое представление даты когда-либо будет интерпретировано на 100% правильно, поскольку для этого потребуется как минимум некоторая информация об используемом форматировании.

Другими словами: определите естественный язык (вы только что использовали две разные его версии в своем вопросе, как правильно указал интерпретатор php)

...