验证这种格式 - “HH:MM”

时间:2010-10-19 02:48:01

标签: php regex preg-match

我正在尝试使用preg_match验证时间输入是否采用此格式 - “HH:MM”

13 个答案:

答案 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:0023: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,语法为:

  

((的条件是模式 |的无图案

条件中的

?=regexp assertion

是 - 模式中的

?: 可选以获得更好的效果,您可以放弃它。这意味着我们在括号()中不需要任何capturing,我们只需要替代功能。

因此,我们仅描述以下内容:

  1. 如果$time字符串以两位数(?=\d{2})开头,请使用(2[0-3]|[01][0-9])模式匹配HH-hour表示法("09:45" case)
  2. 否则使用[0-9]模式匹配H小时表示法("9:45" case)
  3. 更新

    正如他们所说,简约是人才的姊妹。我们不一定需要上述条件模式。对{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");

valid = true

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

valid = false

答案 12 :(得分:-2)

另一种无需使用正则表达式的方法。

localhost/MyProject/other

首先,我检查数据类型是否为字符串。如果不是这样,显然这不是一个有效时间。然后,我检查该字符串是否具有4/5个字母的正确长度。 使用str_replace删除“:”,然后将结果转换为可以轻松与所需时间范围进行比较的整数(在我的示例中为00:00-23:59)。