PHP,如果一个小时介于其他两个小时之间

use*_*585 3 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
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果时间是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(10pm)和07:00(7am)之间,如果是,则应加倍收费。我想避免不得不考虑日期。

Joh*_*nde 5

无需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
}
Run Code Online (Sandbox Code Playgroud)

  • @self PHP 5.3 已经结束;所以假设 5.4 向前推进是完全可以接受的。 (5认同)
  • 它适用于所有*支持*的版本。为了兼容性,我们只能向后走这么远。 (4认同)
  • 要小心,因为`(new DateTime('07:00')-&gt;X_MEMBER_METHOD()` 不适用于所有 PHP 版本。注意对象实例化 (2认同)

小智 5

<?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';
}
Run Code Online (Sandbox Code Playgroud)