比较下面的示例代码hh:mm
和h:mm
时遇到问题。请注意,这是一个示例,实际上,我正在从数据库中检索数据。
此代码使用hh:mm
检查h:mm
和pregex
时间格式,还检查$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:00
和08: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';
}
答案 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));
}