确定日期时间是否在时间范围内的最有效方法

时间:2012-03-11 10:35:26

标签: php datetime datetime-format

我有一个cronjob,每5分钟踢一次。它应该只在一天的特定时间(例如早晚)完成一些任务。

什么是PHP最有效/优雅的方式来确定现在的DateTime是否在5分钟时间范围之间,因为cronjob可能会启动?

我正在做的那一刻:

$date = new DateTime();

$hour = (int)$date->format('H');
$min = (int)$date->format('i');

if($hour == 7 && ($min >= 40 || $min < 45)) {
    // Do something in the morning
}

if($hour == 21 && ($min >= 00 && $min < 05)) {
    // Do something in the evening
}

但这似乎是很多代码。是不是像

那样
$date->isInTimeRane($begin, $end);

作为本机php代码?

3 个答案:

答案 0 :(得分:2)

如果$begin$end的类型也是DateTime,您可以像这样使用它们:

if ($begin <= $date && $date <= $end) {
    // .. date is within the range from $begin -> $end ..

为了解决您的具体问题,这个(相当优雅)的功能如何:

function isWithinTimerange($hours, $minutes, $timerangeInMinutes = 5) {
    $now = new DateTime();

    $begin = clone $now;
    $begin->setTime($hours, $minutes);

    $end = clone $begin;
    $end->modify('+'. intval($timerangeInMinutes) .' minutes');

    return ($begin <= $now && $now < $end);
}

if (isWithinTimerange(7, 40)) {
    // ...

答案 1 :(得分:2)

您可以扩展DateTime以向其添加自己的方法。我会这样做: -

class MyDateTime extends DateTime
{
    /**
    * Checks if this DateTime is between two others
    * @param DateTime $start
    * @param DateTime $end
    * @return boolean 
    */
    public function inRange(DateTime $start, DateTime $end){
        return ($this >= $start && $this <= $end);
    }
}

然后你可以这样做: -

$begin = new DateTime($sometime);
$end = new DateTime($someLaterTime);
$myTime = new MyDateTime($yetAnotherTime);
var_dump($myTime->inRange($begin, $end);

这是我能想到的最干净的方式,而且几乎是你所要求的。

答案 2 :(得分:0)

您可以使用UNIX时间(自Jan,1,1970,又名Epoch以来的秒数)。然后逻辑应该是如下所示。

<?php
$current_time = time(); //Get timestamp
$cron_time = (int) ;// Time cron job runs (you can use strtotime() here)
$five_minutes = 300; //Five minutes are 300 seconds 

if($current_time > $cron_time && $current_time - $cron_time >= $five_minutes) {
echo "Cron Job is too late";
} elseif($current_time >= $cron_time && $five_minutes >= $current_time - $cron_time){
echo "Cron Job ran within time frame";
}

?>