在PHP中比较时间hh:mm和h:mm

时间:2019-10-08 16:30:28

标签: php regex time

比较下面的示例代码hh:mmh:mm时遇到问题。请注意,这是一个示例,实际上,我正在从数据库中检索数据。

此代码使用hh:mm检查h:mmpregex时间格式,还检查$EndTime是否早于$StartTime,它将echo 'Time Error' ,基本上EndTime不能早于StartTime(EndTime应该晚于StartTime)。因此,如果其中一项检查为真,它将echo 'Time Error'

$StartTime = '8:00';
$EndTime = '19:00';
if(!preg_match("/^(?:2[0-3]|[01][0-9]|[0-9]):[0-5][0-9]$/", $StartTime) || ($StartTime > $EndTime)){
    echo 'Time Error';
}
else{
    echo 'Time Correct';
}

如果我将echo 'Time Error'用作8:00,则上面的代码将StartTime。但是,如果我使用08:00作为StartTime,它将echo 'Time Correct'

如果我将其更改为:

$StartTime = '19:00';
$EndTime = '8:00';

它将为echo 'Time Correct',但事实并非如此,因为EndTime早于StartTime。同样,如果我将其更改为08:00,则会向我显示正确的消息。

检查pregex中的8:0008:00都是正确的时间格式。

为什么会这样,如何解决此错误?时间比较有什么问题吗?

在此先感谢您提供的任何帮助。

谢谢Lucas Arbex的strtotime建议。看来现在可以正常工作。

$startTime = ('00:00');
$endTime = ('08:00');

if((!preg_match("/^(?:2[0-3]|[01][0-9]|[0-9]):[0-5][0-9]$/", $startTime)) || (strtotime($startTime) > strtotime($endTime)) || (!preg_match("/^(?:2[0-3]|[01][0-9]|[0-9]):[0-5][0-9]$/", $EndTime))){
  echo 'Time Error';
}
else{
  echo 'Time Correct';
}

3 个答案:

答案 0 :(得分:0)

您只需在验证后使用$starttime = '19:00'; $endtime = '8:00'; $validatedStarttime = preg_match("/([01]?[0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?/", $starttime); $validatedEndtime = preg_match("/([01]?[0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?/", $endtime); if($validatedStarttime && $validatedEndtime) { if(strtotime($starttime) > strtotime($endtime)) { echo 'Time Error'; } else { echo 'Time Correct'; } } else { echo 'Incorrect Format'; } 即可将字符串解析为日期时间,就像这样:

@Echo off

REM (maps network drive)
NET use Z: \\SERVER\PATH

REM (copies any archived security event viewer logs to the network) 
IF EXIST "%SystemRoot%\System32\Winevt\Logs\Archive-Securit*.evtx" (     
      xcopy "%SystemRoot%\System32\Winevt\Logs\Archive-Securit*.evtx" c:\test\ /Y      
      xcopy "c:\test\Archive-Securit*.evtx" \\SERVER\PATH\%computername% /Y

REM (deletes files on the local machine after the files are verified to be on the network share)      
     FORFILES /p "Z:\PATH\%computername%" /c "cmd /c del %SystemRoot%\System32\Winevt\Logs\@file"      
     FORFILES /p "Z:\PATH\%computername%" /c "cmd /c del c:\test\@file"

) ELSE ( 
REM Do nothing 
)

让我知道这是否对您有帮助。

答案 1 :(得分:0)

将格式检查与时间比较分开进行。如果时间还没有,请添加前导零。

if(!preg_match("/^(?:2[0-3]|[01][0-9]|[0-9]):[0-5][0-9]$/", $StartTime) || !preg_match("/^(?:2[0-3]|[01][0-9]|[0-9]):[0-5][0-9]$/", $EndTime)){
    echo 'Time Error';
} else {
    if ($StartTime[1] == ":") {
        $StartTime = "0" . $StartTime;
    }
    if ($EndTime[1] == ":") {
        $EndTime = "0" . $EndTime;
    }
    if ($StartTime > $EndTime) {
        echo 'Time Error';
    } else {
        echo 'Time Correct';
    }
}

答案 2 :(得分:0)

您可以验证传入的时间表达式,并在正则表达式模式中检查可选的前导零。无需进行额外的strtotime()通话。

代码:(PHP Demo)(Regex Demo

$startTime = '19:00';
$endTime = '8:00';

if (!preg_match("~^(?|(2)\K[0-3]|([01]?)\K\d):[0-5]\d$~", $startTime, $start) || 
    !preg_match("~^(?|(2)\K[0-3]|([01]?)\K\d):[0-5]\d$~", $endTime, $end) ||
    (int)$start[1] . $start[0] > (int)$end[1] . $end[0]
) {
        // var_export($start);
    echo "\nTime Error\n";
        // var_export(((int)$start[1] . $start[0]) . ' versus ' . ((int)$end[1] . $end[0]));
}
// outputs: Time Error

以上技术使用一种模式来捕获小时数字(如果紧随其后的是另一个数字,则是可选的),然后使用\K重新开始全字符串匹配。 “分支重置” (|...|...)用于确保将两个捕获组都视为匹配数组中的元素[1]。通过使前导数字为可选,您可以省略原始模式中的第三个分支。另外,我更喜欢\d短于[0-9]


如果对您来说太麻烦了,您还可以考虑允许php将两个字符串作为浮点值进行比较。

代码:(PHP Demo

if (!preg_match("~^(?:2[0-3]|[01]?\d):[0-5]\d$~", $startTime) || 
    !preg_match("~^(?:2[0-3]|[01]?\d):[0-5]\d$~", $endTime) ||
    str_replace(':', '.', $startTime) > str_replace(':', '.', $endTime)
) {
    echo "\nTime Error\n";
        // var_export(str_replace(':', '.', $startTime) . ' versus ' . str_replace(':', '.', $endTime));
}

当然,您可以无条件地使用零填充左侧填充。 (如您所见,有很多方法可以给这只猫蒙皮。)

if (!preg_match("~^(?:2[0-3]|[01]?\d):[0-5]\d$~", $startTime) || 
    !preg_match("~^(?:2[0-3]|[01]?\d):[0-5]\d$~", $endTime) ||
    str_pad($startTime, 5, 0, STR_PAD_LEFT) > str_pad($endTime, 5, 0, STR_PAD_LEFT)
) {
    echo "\nTime Error\n";
        // var_export(str_replace(':', '.', $startTime) . ' versus ' . str_replace(':', '.', $endTime));
}