PHP验证$value中的时间格式是否正确
我有一个在线表单,其中有几个带有时间数据的字段。我将这些数据存储到MySQL数据库的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()将其转换为数据库时间格式。如果它不是这两种格
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
(不允许大写字母)。你是对的;我没有充分考虑这个模式。这就是我在周五回家之前试图写一个连贯的答案得到的结果:(。