Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP验证$value中的时间格式是否正确_Php_Testing_Time_Datetime Format_Time Format - Fatal编程技术网

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

PHP验证$value中的时间格式是否正确,php,testing,time,datetime-format,time-format,Php,Testing,Time,Datetime Format,Time Format,我有一个在线表单,其中有几个带有时间数据的字段。我将这些数据存储到MySQL数据库的time字段中,该字段需要hh:mm:ss格式。如果用户以这种格式正确输入时间,那么我希望接受数据。我还希望允许用户以标准美国时间输入时间,如9:30am或11:25pm或10:27am等 基本上,我首先要测试时间是否为正确的数据库格式(hh:mm:ss),如果不是,则测试它是否为第二种可接受的格式(hh:mm am/pm),如果是,则使用PHP函数strotime()将其转换为数据库时间格式。如果它不是这两种格

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

基本上,我首先要测试时间是否为正确的数据库格式(
hh:mm:ss
),如果不是,则测试它是否为第二种可接受的格式(
hh:mm am/pm
),如果是,则使用PHP函数
strotime()
将其转换为数据库时间格式。如果它不是这两种格式,那么我们将显示一条错误消息并终止

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

我想做的伪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;
    }
?>

功能验证\u时间\u格式() 对于以下值,返回TRUE

2:03:32
02:03:32
23:59:59
15:23 AM
15:23 am
09:41 pm
9:41 PM
etc...
更新: 函数验证\时间\格式() 对于以下值,返回TRUE

2:03:32
02:03:32
23:59:59
15:23 AM
15:23 am
09:41 pm
9:41 PM
etc...
更新:
您已经在使用PHP中的
strotime
,对于您指定的值,实际上不需要强制使用特定的格式

您可能希望测试并确保字段仅使用数字、冒号和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.");
  }
?>

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

您可能希望测试并确保字段仅使用数字、冒号和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.");
  }
?>

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

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

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

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


为什么要强制用户以特定格式输入?您已经在使用strotime()。您必须为strotime提供特定格式,而不是任何任意格式。正如@PenguinCoder所指出的,strotime()将理解用户输入的任何格式。为什么不尝试转换,并向用户显示如果存在任何不确定性,结果是什么?感谢您的建议,这是一种方法。我建议对两种正确格式使用
date('H:I:s',strotime($value))
,以确保您的输出
$value
hh
部分具有前导零。查看我的更新仅供参考。为什么您要强制用户以特定格式输入?您已经在使用strotime()。您必须为strotime提供特定格式,而不是任何任意格式。正如@PenguinCoder所指出的,strotime()将理解用户输入的任何格式。为什么不尝试转换,并向用户显示如果存在任何不确定性,结果是什么?感谢您的建议,这是一种方法。我建议对两种正确格式使用
date('H:I:s',strotime($value))
,以确保您的输出
$value
hh
部分具有前导零。查看我的更新仅供参考。第一个模式无法匹配
00:00:05
(由于
0[1-9]
条件),
23:00:00
(因为不允许
hh
以2开头),
7:00:00
(因为它强制
hh
部分前导零)。第二个模式无法匹配
0:34 am
hh
只能是1-9),
05:00 pm
(与上一个示例相同的原因),
11:59 pm
(不允许大写字母)。您是对的;我没有充分考虑这个模式。这就是我在周五回家前试图写一个连贯的答案的结果:(.1st模式不能匹配
00:00:05
(因为
0[1-9]
条件),
23:00:00
(因为不允许以2开头的
hh
7:00
(因为它强制在
hh
部分前导零).2nd模式不能匹配
0:34 am
hh
只能是1-9),
05:00 pm
(与上一个示例相同的原因),
11:59 pm
(不允许大写字母)。你是对的;我没有充分考虑这个模式。这就是我在周五回家之前试图写一个连贯的答案得到的结果:(。