我有一个在线表单,其中包含一些包含时间数据的字段。我将这些数据存储到MySQL数据库中的time
字段中,该字段需要格式hh:mm:ss
。如果用户以正确的格式输入时间,那么我想接受数据。我还希望允许用户在标准美国时间输入时间,例如9:30 am
或11:25 pm
或10: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;
}
?>
答案 0 :(得分:8)
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.");
}
?>