PHP验证$ value中的正确时间格式

时间:2012-03-23 15:48:39

标签: php testing time datetime-format time-format

我有一个在线表单,其中包含一些包含时间数据的字段。我将这些数据存储到MySQL数据库中的time字段中,该字段需要格式hh:mm:ss。如果用户以正确的格式输入时间,那么我想接受数据。我还希望允许用户在标准美国时间输入时间,例如9:30 am11:25 pm10:27 am等。

基本上我想先测试时间是否采用正确的数据库格式(hh:mm:ss),如果不是,请测试它是否采用第二种接受格式(hh:mm am/pm),并且如果是,那么我将使用PHP函数strtotime()将其转换为数据库时间格式。如果它不是这两种格式,那么我们会显示错误消息并死掉。

有人知道如何测试变量的值是否与这些时间格式之一匹配?

我想做的伪PHP代码:

<?php
    $value = //some time;
    if (is_database_time($value)){
        // good no problem
    }else if (is_usa_time($value)){
        $value = strtotime($value);
    }else{
        die("error incorrect time format, try again.");
    }
?>

**编辑**

感谢大家的帮助。我在这里使用了一些信息来制作一个完美的功能:

<?php
    function filter_time($key,$value){
        // this section handles the storage of time data
        if (preg_match('/^(0?\d|1\d|2[0-3]):[0-5]\d:[0-5]\d$/', $value)){
            //do nothing
        }else if (preg_match('/^(0?\d|1[0-2]):[0-5]\d\s(am|pm)$/i', $value)){
            $value = date( 'H:i:s', strtotime($value));
        }else{
            display_error('incorrect time format in '.$key.' field.');
        }
        return $value;
    }
?>

3 个答案:

答案 0 :(得分:8)

function verify_time_format()

function verify_time_format ($value) {

  $pattern1 = '/^(0?\d|1\d|2[0-3]):[0-5]\d:[0-5]\d$/';
  $pattern2 = '/^(0?\d|1[0-2]):[0-5]\d\s(am|pm)$/i';
  return preg_match ($pattern1, $value) || preg_match ($pattern2, $value);

}

为以下值返回 TRUE

2:03:32
02:03:32
23:59:59
15:23 AM
15:23 am
09:41 pm
9:41 PM
etc...

更新

function filter_time ($key, $value) {

  $p1 = '/^(0?\d|1\d|2[0-3]):[0-5]\d:[0-5]\d$/';
  $p2 = '/^(0?\d|1[0-2]):[0-5]\d\s(am|pm)$/i';

  if (preg_match ($p1, $value) || preg_match ($p2, $value))
    $res = date ('H:i:s', strtotime ($value));

  else
    display_error ("incorrect time format in {$key} field.");

  return $res;

}

答案 1 :(得分:3)

您已经在使用PHP中的strtotime,对于您指定的值,实际上不需要强制使用特定格式。

您可能想要测试并确保的是,该字段仅在Wh1T3h4Ck5答案中使用数字,冒号,上午或下午进行验证。

有了这些,您的代码可能类似于以下

<?php

  function valid_time($value) {//Wh1T3h4Ck5's function
    return preg_match('/^(0?\d|1[0-2]):[0-5]\d\s(am|pm)$/i', $value);
  }

  $value = //some time;
  if (vald_time($value)){
    $time_value = strtotime($value);
    echo $time_value;
  }else{
    die("Error incorrect time format, try again.");
  }
?>

虽然更优雅的解决方案会考虑使用Jquery / Javascript PRIOR提交表单。在提交PHP脚本之前,您可以测试并警告用户格式不正确。尽管如此,也可以在PHP脚本中保留验证,如果需要还可以使用其他安全措施。

答案 2 :(得分:1)

您可以使用正则表达式轻松解决问题。例如:

<?php
  $databaseTimePattern = '/^(0[0-9])|(1[0-2]):[0-5][0-9]:[0-5][0-9]$/'; //Matches times in the form hh:mm:ss
  $usaTimePattern = '/^([1-9]|(1[0-2])):[0-5][0-9] [a|p]m$/'; //Matches times in the form hh:mm am/pm

  $value = //some time;
  if (preg_match($databaseTimePattern, $value)){
    // good no problem
  }else if (preg_match($usaTimePattern, $value)){
    $value = strtotime($value);
  }else{
    die("error incorrect time format, try again.");
  }
?>