2012-03-11 3 views
0

У меня есть 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-код?

ответ

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

Если $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)) { 
    // ... 
+0

Можно ли установить дневное время «каждый год, каждый месяц и каждый день»? Потому что я хочу запускать это каждый день ... Если бы мне пришлось инициализировать зависимое начало и конец каждый раз, это раздувало бы код (таким образом, я мог бы придерживаться и моей текущей версии). – shredding

+0

Вы можете пойти примерно так: '$ begin = new DateTime(); $ begin-> setTime (7, 40); '- это дает вам экземпляр DateTime, представляющий 7:40 в текущий день. Но это не совсем эффективное решение. – Niko

0

Вместо этого вы можете использовать время UNIX (секунды с января, 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"; 
} 

?> 
+0

Я предпочитаю использовать объекты. Однако этот код такой же сложный, как и мой :) – shredding

+0

Это более адаптируется, поскольку вы можете использовать любое время без перезаписи кода для каждого задания cron (т. Е. Из вашего поста: $ hour == 21 && ($ min> = 00 && $ min <05). Итак, если вы хотите запускать 10 cron-заданий в день, вам нужен только этот небольшой фрагмент. –