PHP检查时间是否在两个时间之间,不考虑日期

8
我是一名有用的助手,可以翻译文本。

我正在编写一个脚本,需要检查一个时间范围是否在两个时间之间,而不考虑日期。

例如,我有这两个日期:

$from = 23:00
$till = 07:00

我有以下时间要检查:
$checkFrom = 05:50 
$checkTill = 08:00

我需要创建一个脚本,如果其中一个检查值在$from/$till范围内,则返回true。在这个例子中,函数应该返回true,因为$checkFrom在$from/$till范围内。但是以下情况也应该是正确的:
$checkFrom = 22:00
$checkTill = 23:45

只需比较它们... if ($from <= $checkFrom && $checkFrom <= $till) - Ares Draguna
实现这种情况的脚本需要一些猜测。因为我们不知道需要检查的时间是今天(对于您的“from”变量)还是明天(对于您的“till”变量)。 - Bearwulf
1
05:50 这样的时间不是有效的变量,因此您必须将它们用作以下之一:array(5,50)"05:50" 或时间戳(整数)。 - user669677
7个回答

36

尝试使用这个函数:

function isBetween($from, $till, $input) {
    $f = DateTime::createFromFormat('!H:i', $from);
    $t = DateTime::createFromFormat('!H:i', $till);
    $i = DateTime::createFromFormat('!H:i', $input);
    if ($f > $t) $t->modify('+1 day');
    return ($f <= $i && $i <= $t) || ($f <= $i->modify('+1 day') && $i <= $t);
}

demo


3
对于那些不知道感叹号含义的人:!将所有字段(年、月、日、小时、分钟、秒、分数和时区信息)重置为Unix纪元。没有!,所有字段都将设置为当前日期和时间。参考资料:http://php.net/manual/en/datetime.createfromformat.php - Yohanim
你能否提供这段代码并使用日期时间格式如 Y-m-d H:i? - seema
1
@glavić 如果能解释一下代码片段的作用就更好了,不要只是简单地粘贴。我知道有些人可以自己理解,但在分享代码片段时,给出一些解释会更有帮助,特别是当使用不常见的方法时,比如时间格式中的 !,可能需要提供相关文档链接。 - Uriahs Victor

3

根据2astalavista的答案:

您需要正确格式化时间,其中一种方法是使用PHP的strtotime()函数,这将创建一个Unix时间戳,您可以用来进行比较。

function checkUnixTime($to, $from, $input) {
    if (strtotime($input) > strtotime($from) && strtotime($input) < strtotime($to)) {
        return true;
    }
}

2

以下函数即使在较旧版本的PHP中也可以使用:

function isBetween($from, $till, $input) {
    $fromTime = strtotime($from);
    $toTime = strtotime($till);
    $inputTime = strtotime($input);

    return($inputTime >= $fromTime and $inputTime <= $toTime);
}

2

这段代码对我有效

如果($start_time<=date("H:i") && $end_time>=date("H:i")) {

}


0

我认为这是可能的最紧凑的函数:

function isBetween($f, $t, $i) {
    return ($f > $t) ? !($t <= $i && $i <= $f) : ($f <= $i && $i <= $t);
}

0
$tomorrow = new DateTime('tomorrow');

$currentTime = strtotime(date('Y-m-d H:i'));
$startTime = strtotime(date('Y-m-d').' 23:00');

// $endtime date will be next day during time 23 to 00.
if (strtotime(date('H:i')) > strtotime('23:00') && strtotime(date('H:i')) < strtotime('00:00')) {
    $endTime = strtotime($tomorrow->format('Y-m-d').' 07:00');
} else {
    $endTime = strtotime(date('Y-m-d').' 07:00');
}

$flag = false;
if ($currentTime > $startTime || $currentTime < $endTime) {
    $flag = true;
}

return $flag;

-1

试试这个:

function checkTime($From, $Till, $input) {
    if ($input > $From && $input < $Till) {
        return True;
    } else {
        return false;
}

如果我将05:50作为$input传递,该函数将返回false,尽管它在$from和$till之间,这是行不通的。 - user1393817

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接