【问题标题】:PHP verify correct time format in $valuePHP 在 $value 中验证正确的时间格式
【发布时间】:2012-04-08 04:40:31
【问题描述】:

我有一个在线表单,其中包含一些包含时间数据的字段。我将此数据存储到 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;
    }
?>

【问题讨论】:

  • 为什么要强制用户输入特定格式?您已经在使用 strtotime()。
  • 你必须提供特定格式的strtotime,不是任何任意格式都可以。
  • 正如@PenguinCoder 所指出的,strtotime() 几乎可以理解用户输入的任何格式。为什么不尝试转换,如果有任何不确定性,向用户展示结果是什么?
  • 感谢您的建议,这是一种方法。
  • 我建议对这两种正确的格式使用date('H:i:s', strtotime($value)),以确保您的输出$valuehh 部分中具有前导零。请参阅我的更新仅供参考。

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


【解决方案1】:

函数 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;

}

【讨论】:

    【解决方案2】:

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

    您可能想要测试和确保的是,该字段仅使用数字、冒号和 am 或 pm 进行验证,如 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。您可以在提交到 PHP 脚本之前测试并警告用户格式不正确。将验证保留在 PHP 脚本中,如果需要,还可以使用其他保护措施。

    【讨论】:

      【解决方案3】:

      您可以使用正则表达式很容易地解决问题。例如:

      <?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.");
        }
      ?>
      

      【讨论】:

      • 第一个模式不能匹配00:00:05(因为0[1-9]条件),23:00:00(因为不允许hh以2开头),7:00:00(因为它强制领先hh 部分为零)。第二个模式不能匹配 0:34 amhh 只能是 1-9)、05:00 pm(与上一个示例相同的原因)、11:59 PM(不允许大写字母)。
      • 你是对的;我没有充分考虑这个模式。这就是我在星期五回家之前尝试写一个连贯的答案的结果:(。
      猜你喜欢
      • 2012-06-15
      • 2021-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多