web-dev-qa-db-ja.com

この形式を検証する-"HH:MM"

preg_matchを使用して、時間入力がこの形式であることを検証しようとしています-"HH:MM"

25
Catfish

正規表現を使用して確認できます。

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)

1:から24:59までの24時間時計を使用する場合は、

preg_match("/^(?:2[0-4]|[01][1-9]|10):([0-5][0-9])$/", $foo)
73
Charles

例外をスローせずに日付(および/または時刻)を検証する単純な関数。期待される 日付形式 をパラメーターとして使用します。

function isValidDate($date, $format = 'Y-m-d') {
    $dateObj = DateTime::createFromFormat($format, $date);
    return $dateObj && $dateObj->format($format) == $date;
}

動作方法:渡された$formatに従って入力日付をPHP DateTimeオブジェクトに変換し、このオブジェクトを元の入力日付と比較します。一致する場合、日付は有効であり、予期される形式です。

いくつかの使用例:

/* 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");
14
T30

確認したい時刻が$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/>';
    }

}
12
Toskan

文字列が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
zion ben yacov

午前と午後を行うことができる12時間の試合の場合、これを使用します

/^(1[0-2]|0?[1-9]):[0-5][0-9] (AM|PM)$/i

午前1時20分または午前1時20分を処理します。上記の12時間の例は、可能性があるため、正しくありませんでした。

00:20

これは有効な12時間形式ではありません。

2
Steve M.

できるよ:

if(preg_match('/^(?:[01][0-9]|2[0-3]):[0-5][0-9]$/',$input)) {
        // $input is valid HH:MM format.
}
2
codaddict

@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}";
}
1
user2430012

希望する形式に従って、時間、分、秒を検証する関数:

function validTime($time, $format='H:i:s') {
    $d = DateTime::createFromFormat("Y-m-d $format", "2017-12-01 $time");
    return $d && $d->format($format) == $time;
}

使い方:

$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");

有効= false

1
TILiBRA

チャールズのエレガントな回答と正規表現に基づいています。 "HH:MM""H:MM"(つまり"9:45"/"09:45")の両方を1行で検証する必要がある場合は、次の正規表現を使用して24時間形式に一致させます。

preg_match("/^(?(?=\d{2})(?:2[0-3]|[01][0-9])|[0-9]):[0-5][0-9]$/", $time)

説明

(?条件付きサブパターン を表し、構文は次のとおりです。

(?(conditionyes-pattern|no-pattern

?= inconditionis regexp assertion

?: inyes-patternは、パフォーマンス向上のためにoptionalであり、ドロップしてもかまいません。つまり、括弧()内に capturing は必要ありません。代替機能だけが必要です。

したがって、以下についてのみ説明します。

  1. $time文字列が2桁の(?=\d{2})で始まる場合は、(2[0-3]|[01][0-9])パターンを使用してHH時間表記に一致させます("09:45"の場合)
  2. それ以外の場合は、[0-9]パターンを使用してH時間表記に一致させます("9:45"ケース)

更新

彼らが言うように、シンプルさは才能の姉妹です。上記の条件パターンは必ずしも必要ではありません。 24時間形式の"HH:MM/H:MM"のより簡単な検証:

preg_match("/^(?:2[0-3]|[01][0-9]|[0-9]):[0-5][0-9]$/", $time)

繰り返しますが、グループ化括弧内の?:()は、キャプチャーを無効にするためのオプションです。ドロップすることができます。

したがって、この正規表現では、()を使用した代替サブパターンは、最初の(20..23)および2番目の(01..19)パターンで2桁の時間、最後の3番目のパターンで1桁を照合しようとしています。 (0..9)。

さらに、12時間形式の"HH:MM/H:MM"の検証:

preg_match("/^(?:0?[1-9]|1[012]):[0-5][0-9]$/", $time);

ここでは、最初の1桁(1..9)と可能な先行ゼロ(0?)、次に2桁(10..12)を照合しようとしています。

0

秒(24時間)を探している場合。これは私にとって魅力のように働きました。

$time = "23:59:60";    
preg_match("/^([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/", $time)
0
Roshimon

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;
    }
}
0
Lakshitha Udara

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を意味する場合)。

0
Sablefoste