我正在尝试使用preg_match
验证时间输入是否采用此格式 - “HH:MM”
答案 0 :(得分:69)
您可以使用正则表达式来检查。
持续12小时:
preg_match("/^(?:1[012]|0[0-9]):[0-5][0-9]$/", $foo)
24小时:
preg_match("/^(?:2[0-3]|[01][0-9]):[0-5][0-9]$/", $foo)
如果您使用从 01:00 到 24:59 的24小时制,请使用
preg_match("/^(?:2[0-4]|[01][1-9]|10):([0-5][0-9])$/", $foo)
答案 1 :(得分:12)
让我们想象您要检查的时间是$timeStr
,并且根据日期规范必须是格式H:i
。
使用正则表达式是恕我直言愚蠢。这更容易阅读:
<强>已更新强>
$timeStr = " 02:00"; //example of valid time, note whitespace
test($timeStr);
$timeStr = "23:59"; //valid
test($timeStr);
$timeStr = "24:00"; //invalid
test($timeStr);
$timeStr = "25:00"; //invalid
test($timeStr);
$timeStr = "16:61"; // invalid
test($timeStr);
//tests 23:59 hour format
function test($timeStr){
$dateObj = DateTime::createFromFormat('d.m.Y H:i', "10.10.2010 " . $timeStr);
if ($dateObj !== false && $dateObj && $dateObj->format('G') ==
intval($timeStr)){
//return true;
echo 'valid <br/>';
}
else{
//return false;
echo 'invalid <br/>';
}
}
答案 2 :(得分:9)
简单函数,用于验证日期(和/或时间)而不抛出异常。只需通过您期望的format:
function isValidDate($date, $format = 'Y-m-d') {
$dateObj = DateTime::createFromFormat($format, $date);
return $dateObj && $dateObj->format($format) == $date;
}
$format
参数非常重要:它用于将输入String
转换为DateTime
对象,然后将DateTime
转换回String
与输入的一个进行比较。
一些用法示例:
/* Valid Examples: */
isValidDate("2017-05-31");
isValidDate("23:15:00", 'H:i:s');
isValidDate("2017-05-31 11:15:00", 'Y-m-d h:i:s');
/* Invalid: */
isValidDate("2012-00-21");
isValidDate("25:15:00", 'H:i:s');
isValidDate("Any string that's not a valid date/time");
答案 3 :(得分:4)
这是一个代码,用于检查字符串是否在00:00到23:59之间的小时
$checked = false;
if (preg_match('/^\d{2}:\d{2}$/', $str)) {
if (preg_match("/(2[0-3]|[0][0-9]|1[0-9]):([0-5][0-9])/", $str)) {
$checked = true;
}
}
var_dump($checked );die;
答案 4 :(得分:2)
你可以这样做:
if(preg_match('/^(?:[01][0-9]|2[0-3]):[0-5][0-9]$/',$input)) {
// $input is valid HH:MM format.
}
答案 5 :(得分:2)
对于可以在上午和下午进行的12小时比赛,请使用此
/^(1[0-2]|0?[1-9]):[0-5][0-9] (AM|PM)$/i
它将在凌晨01:20或凌晨1:20处理。 上面的例子12小时是不正确的,因为你可能会这样做:
00:20
这不是有效的12小时格式。
答案 6 :(得分:1)
扩展@Toskan写的内容,你可以这样做以00:00格式验证。如果有效且在00:00和23:59之间返回true。
这也允许使用不同的时间格式......
function isTimeValid($time_str, $format = 'H:i')
{
$DateTime = \DateTime::createFromFormat( "d/m/Y {$format}", "10/10/2010 {$time_str}" );
return $DateTime && $DateTime->format( "d/m/Y {$format}" ) == "10/10/2010 {$time_str}";
}
答案 7 :(得分:0)
如果您不需要preg_match
,这是另一种新方法:
$thetime = "20:15" // set the time
$timecheck = explode(":", filter_var($thetime, FILTER_SANITIZE_URL));
$hourvalid = $minvalid = false;
if (count($timecheck) > 1 && count($timecheck) < 4) {
$hourvalid = ((abs(filter_var($timecheck[0], FILTER_SANITIZE_NUMBER_INT)) < 24)
&& (abs(filter_var($timecheck[0], FILTER_SANITIZE_NUMBER_INT)) === (INT) $timecheck[0]))
? true : false;
$minvalid = ((abs(filter_var($timecheck[1], FILTER_SANITIZE_NUMBER_INT)) < 60)
&& (abs(filter_var($timecheck[1], FILTER_SANITIZE_NUMBER_INT)) === (INT) $timecheck[1]))
? true : false;
}
if ($hourvalid && $minvalid) {//valid time
echo $thetime . " is a valid time<br />";
} else {//invalid time
echo $thetime . " is NOT a valid time<br />";
}
可能不是世界上最有效的方法,但它完成了它。仅对从00:00
到23:59
的时间有效。此外,8:0
验证为时间(假设您的意思是08:00
)。
答案 8 :(得分:0)
如果您只想验证HH:MM字符串
,请更正@Toskan的答案 protected function isValidTime($timeStr){
$dateObj = DateTime::createFromFormat('d.m.Y H:i', "10.10.2010 " . $timeStr);
$dateObjOffset = DateTime::createFromFormat('d.m.Y H:i', "10.10.2010 " . '24:00');
if($dateObjOffset <= $dateObj){
return false;
}
if ($dateObj !== false) {
return true;
}
else{
return false;
}
}
答案 9 :(得分:0)
基于Charles的优雅答案和正则表达。如果您需要"HH:MM"
和"H:MM"
(即"9:45"
/ "09:45"
)的单行验证,请使用以下正则表达式匹配24小时格式:
preg_match("/^(?(?=\d{2})(?:2[0-3]|[01][0-9])|[0-9]):[0-5][0-9]$/", $time)
(?
代表conditional subpattern,语法为:
条件中的 是 - 模式中的((的条件强>)是模式强> |的无图案强>)
?:
可选以获得更好的效果,您可以放弃它。这意味着我们在括号()
中不需要任何capturing,我们只需要替代功能。
因此,我们仅描述以下内容:
$time
字符串以两位数(?=\d{2})
开头,请使用(2[0-3]|[01][0-9])
模式匹配HH-hour表示法("09:45"
case)[0-9]
模式匹配H小时表示法("9:45"
case)正如他们所说,简约是人才的姊妹。我们不一定需要上述条件模式。对{strong> 24小时格式的"HH:MM/H:MM"
进行更简单的验证:
preg_match("/^(?:2[0-3]|[01][0-9]|[0-9]):[0-5][0-9]$/", $time)
同样,在分组括号?:
中()
是禁用捕获的可选项,您可以删除它。
因此,在此正则表达式中,使用()
的替代子模式尝试在第一个(20..23
)和第二个(01..19
)模式下匹配两个数字小时,然后在最后一个(0..9
)。
此外,验证"HH:MM/H:MM"
12小时格式:
preg_match("/^(?:0?[1-9]|1[012]):[0-5][0-9]$/", $time);
在这里,我们尝试将前一个数字(1..9
)与可能的前一个零(0?
)匹配,然后匹配两个数字(10..12
)。
答案 10 :(得分:0)
如果您正在寻找秒(24小时)。这对我来说就像是一种魅力。
$time = "23:59:60";
preg_match("/^([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/", $time)
答案 11 :(得分:0)
根据所需格式验证小时,分钟和秒的功能:
$valid = validTime("23","H");
$valid = validTime("23:59","H:i");
$valid = validTime("23:59:59","H:i:s");
$valid = validTime("23:59:59");
$valid = validTime("25","H");
$valid = validTime("01:60","H:i");
$valid = validTime("01:20:61","H:i:s");
$valid = validTime("01:20:61");
spring.datasource.url=jdbc:mysql://xyz:3306/xyz
spring.datasource.username=xyz
spring.datasource.password=xyz
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.properties.hibernate.connection.driver_class=com.mysql.cj.jdbc.Driver
# Below properties don't change transactions behaviour
spring.jpa.properties.hibernate.ddl-auto = create-drop
spring.jpa.properties.javax.persistence.query.timeout=30
spring.datasource.tomcat.test-while-idle=true
spring.datasource.tomcat.time-between-eviction-runs-millis=5000
spring.datasource.tomcat.initial-size=1
spring.datasource.tomcat.max-active=1
spring.datasource.tomcat.max-idle=1
spring.datasource.tomcat.max-wait=5000
spring.datasource.tomcat.log-abandoned=true
答案 12 :(得分:-2)
另一种无需使用正则表达式的方法。
localhost/MyProject/other
首先,我检查数据类型是否为字符串。如果不是这样,显然这不是一个有效时间。然后,我检查该字符串是否具有4/5个字母的正确长度。 使用str_replace删除“:”,然后将结果转换为可以轻松与所需时间范围进行比较的整数(在我的示例中为00:00-23:59)。