на php.net в комментах нашел такое: PHP: <?php /** * Checks date if matches given format and validity of the date. * Examples: * <code> * is_date('22.22.2222', 'mm.dd.yyyy'); // returns false * is_date('11/30/2008', 'mm/dd/yyyy'); // returns true * is_date('30-01-2008', 'dd-mm-yyyy'); // returns true * is_date('2008 01 30', 'yyyy mm dd'); // returns true * </code> * @param string $value the variable being evaluated. * @param string $format Format of the date. Any combination of <i>mm<i>, <i>dd<i>, <i>yyyy<i> * with single character separator between. */ function is_valid_date($value, $format = 'dd.mm.yyyy'){ if(strlen($value) >= 6 && strlen($format) == 10){ // find separator. Remove all other characters from $format $separator_only = str_replace(array('m','d','y'),'', $format); $separator = $separator_only[0]; // separator is first character if($separator && strlen($separator_only) == 2){ // make regex $regexp = str_replace('mm', '(0?[1-9]|1[0-2])', $format); $regexp = str_replace('dd', '(0?[1-9]|[1-2][0-9]|3[0-1])', $regexp); $regexp = str_replace('yyyy', '(19|20)?[0-9][0-9]', $regexp); $regexp = str_replace($separator, "\\" . $separator, $regexp); if($regexp != $value && preg_match('/'.$regexp.'\z/', $value)){ // check date $arr=explode($separator,$value); $day=$arr[0]; $month=$arr[1]; $year=$arr[2]; if(@checkdate($month, $day, $year)) return true; } } } return false; } вопрос такой: может кто-нить поделится универсальной ф-цией проверки даты? входные параметры: проверяемая строка, формат (как в оригинальной ф-ции date)?
Даже человек не всегда в силах различить дату. Дам пример: 09.06.11 .. нет, это не девятое июня 2011 года - нет, это 6 ноября 2009 года. Поэтомы сверху описаны универсальнейшие варианты.
ну вот у меня в проекте разрешено записывать время отдыха в отеле в формате мм.гггг. Ну и нужно как-то проверить то, что прислал пользователь. А при регистрации он задает дату рождения дд.мм.гг А при редактировании новости записывается дата в формате MySQL DateTime.. и так далее
А я всё в timestamp пишу и через mktime прогоняю. Удобно форматировать вывод с помощью date - это раз, никаких проблем со стандартами - два. Естественно, поскольку у нас ограничение есть - 1970г., то даты рождения пишем как они есть.
нашел http://grezz.ru/?p=123 и PHP: <?php /******************************************************* * Simple function to take in a date format and return array of associated * formats for each date element * * @return array * @param string $strFormat * * Example: Y/m/d g:i:s becomes * Array * ( * [year] => Y * [month] => m * [day] => d * [hour] => g * [minute] => i * [second] => s * ) * * This function is needed for PHP < 5.3.0 ********************************************************/ function date_parse_from_format($stFormat, $stData) { $aDataRet = array(); $aPieces = split('[:/.\ \-]', $stFormat); $aDatePart = split('[:/.\ \-]', $stData); foreach ($aPieces as $key=>$chPiece) { switch ($chPiece) { case 'd': case 'j': $aDataRet['day'] = $aDatePart[$key]; break; case 'F': case 'M': case 'm': case 'n': $aDataRet['month'] = $aDatePart[$key]; break; case 'o': case 'Y': case 'y': $aDataRet['year'] = $aDatePart[$key]; break; case 'g': case 'G': case 'h': case 'H': $aDataRet['hour'] = $aDatePart[$key]; break; case 'i': $aDataRet['minute'] = $aDatePart[$key]; break; case 's': $aDataRet['second'] = $aDatePart[$key]; break; } } return $aDataRet; } на работоспособность не проверял. Обе они не возвращают ошибок и варнингов(
имеем такой быдлокод http://pastebin.mozilla-russia.org/102482 isValidDate('10.2002', 'm.Y') - false. в момент сравнения $date и change_date_format($date, $format, $format); change_date_format возвращает 09.2002
Делаю так же, как Apple. Одно "но". Мы ограничены не 1970 Код (Text): shock@shock:~$ php -r 'echo date("Y", -2000000000);' 1906
Код (Text): if (! ($timestamp = strtotime($input_date)) return false; $formated_date = date($format, $timestamp); if ($input_date != $formated_date) return false; return true; =)
Koc, ну да, если уж очень хочется, что бы дата была в одном формате. Хотя по мне, так просто использовать strtotime достаточно. А для пользователей нужно нормальныое UI, что бы он не морочился форматом, а на входе в валидаторе банальный регексп.
нормальный UI будет. Но мне все равно нужно проверять что от него приходит. Каким образом твой код обработает 14:59? (без одной минуты 3 часа)
А самому проверить? Код (Text): php -r ' $time = strtotime("14:59"); print date("r", $time); ' Thu, 05 Nov 2009 14:59:00 +0300
блин. Ну я все равно помню, что это хуже чем date_parse_from_format. В зависимости от локали она по-разному работает. Помню, что на локальной машине все нормально работало, а на дев-сервере бочинило.