PHP如果一个小时在两个小时之间

时间:2014-10-15 00:15:16

标签: php datetime

如果当前时间介于两个其他时间之间,我需要确定一下。例如,要检查时间是否在07:00到10:00之间,我可以使用:

$currentTime = new DateTime('09:00');
$startTime = new DateTime('07:00');
$endTime = new DateTime('10:00');

if ($currentTime->format('H:i') >= $startTime->format('H:i') && $currentTime->format('H:i') <= $endTime->format('H:i')) {
    // Do something
}

我遇到的问题是如果时间是01:00会发生什么,我想检查它是否在22:00到07:00之间。我并不担心这是另一天,只要它在24小时制的两个小时之间。示例01:00在22:00到07:00之间

22:00,23:00,00:00, 01:00 ,02:00~07:00

我最终想要实现的是,可以在不同时间之间为服务设置不同的价格。因此,我现在循环每小时计算出小时所涉及的价格范围并相应地改变价格。如果有人有更优雅的解决方案,我将不胜感激。

更新

假设我有一条规则说在晚上10点到早上7点之间我要收取双倍费用。我从开始时间到结束时间循环每小时,检查每小时是否在22:00(晚上10点)和07:00(早上7点)之间,如果是,则应收取双倍费用。我想避免考虑约会日期。

4 个答案:

答案 0 :(得分:4)

无需使用DateTime::format()进行比较。 DateTime个对象已经具有可比性。

要处理跨越午夜的时间段,您需要更改日期,以便准确反映实际日期。

$currentTime = (new DateTime('01:00'))->modify('+1 day');
$startTime = new DateTime('22:00');
$endTime = (new DateTime('07:00'))->modify('+1 day');

if ($currentTime >= $startTime && $currentTime <= $endTime) {
    // Do something
}

答案 1 :(得分:4)

<?php
$currentTime = strtotime('1:00');
$startTime = strtotime('22:00');
$endTime = strtotime('7:00');

if (
        (
        $startTime < $endTime &&
        $currentTime >= $startTime &&
        $currentTime <= $endTime
        ) ||
        (
        $startTime > $endTime && (
        $currentTime >= $startTime ||
        $currentTime <= $endTime
        )
        )
) {
    echo 'open';
} else {
    echo 'clse';
}

答案 2 :(得分:1)

从第一个更流行的解决方案开始,我发现了另一种方法,该方法对我不起作用。

我必须在10:00 pm和06:00 am之间写点东西,并且比较不起作用,因为当我经过午夜时,endTime总是>开始时间。

所以,如果我不介意以这种方式解决的那一天:

$currentTime = new DateTime();
$startTime = new DateTime('22:00');
$endTime = (new DateTime('06:00'))->modify('+1 day');

if ($currentTime->format("a") == "am") { 
   // echo "It's a new day <br />"; 
   $currentTime = $currentTime->modify('+1 day');
}


if ($currentTime >= $startTime && $currentTime <= $endTime) {
    echo "hello";
}

答案 3 :(得分:0)

    //get current DateTime
    $date = new DateTime('now');
    $currentHour = 0;
    $currentMinutes = 0;
    foreach ($date as $item=>$value ) {
        if($item=="date"){
            $p = explode(" ",$value)[1];
            $hour = explode(":",$p);
            $currentHour = $hour[0];
            $currentMinutes = $hour[1];
        }
    }
    $returnVO["success"] = ((int)$currentHour<12 || ((int)$currentHour>=22 && (int)$currentMinutes > 0) ) ? false : true;