2012-03-04 2 views

ответ

3

Полностью с питанием решение:

function validate($str) 
{ 
    preg_match('/^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})$/', $str, $matches); 

    if (count($matches) != 7) 
     return false; 

    $valid_year = range(2000, 2050); // your range 
    $valid_month = range(1, 12); 
    $valid_day = range(1, 31); 
    $valid_hour = range(0, 24); 
    $valid_minute = range(0, 59); 
    $valid_second = range(0, 59); 

    list($str, $year, $month, $day, $hour, $minute, $second) = $matches; 

    foreach(array('year', 'month', 'day', 'hour', 'minute', 'second') as $part) 
    { 
     if (!in_array($$part, ${'valid_'.$part})) 
      return false; 
    } 

    return checkdate($month, $day, $year); // this will reject absurd values like February 30 or April 31 
} 

EDIT: Я не доверяю strtotime. Например: «Допустимый диапазон временной метки, как правило, от Fri, 13 Dec 1901 20:45:54 UTC to Tue, 19 Jan 2038 03:14:07 UTC». (приведено на странице с strtotime). Что делать, если я хочу принять даты из этого диапазона? Для меня strtotime - неизвестный черный ящик. Не поймите меня неправильно: я использую это, в конце концов! Но я бы этого не сделал.

1

Попробуйте это регулярное выражение, положив письмо «T» между датой регулярных выражений и времени регулярное выражение:

(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}) 
+0

Это первый шаг, так как он позволит что-то вроде «1234-56-78T90: 98: 76». –

+0

Спасибо. Другая часть проверки не является проблематичной. –

1
^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$ 

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

1

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

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

Пример:

$date1 = "2011-02-23T13:04:41"; 
$date2 = str_replace("T", " ", $date1); // removing the T 
$date3 = strtotime($date2); 

Теперь вы просто проверить и работать с $ date3 .. если это действительное или соответствует вашим необходимым критериям, то исходная введенная дата, а также.

Только в случае, если вам не нужен весь этот беспорядок, идти равнина:

(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}) // pseudo - not tested 
1

Проверяется, если значение времени представляет собой действительную дату:

$t = strtotime($yourTimeString); 

if ($t === FALSE) { 
    // $yourTimeString is not valid. 
} 

Если вы хотите проверить string, используйте проверку регулярных выражений.

+0

как насчет письма? он не узнает его, я думаю. – Juvanis

+1

Это позволит указать дату и время в нескольких других форматах, кроме OP, которые необходимо проверить. –

+0

@deporter Он делает. http://ideone.com/ApI9Y – Tomalak

Смежные вопросы