2012-03-11 4 views
0

나는 5 분마다 시작하는 cronjob을 가지고 있습니다. 하루 중 특정 시간에만 (예 : 아침과 저녁) 일부 작업을 수행해야합니다.날짜 시간이 시간 프레임 내에 있는지 확인하는 가장 효과적인 방법

현재 DateTime이 cronjob이 시작될 수있는 5 분 시간 프레임 사이에 있는지를 확인하는 가장 효과적이고 우아한 방법은 무엇입니까?

$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 코드로? $begin$end뿐만 아니라 형식의 날짜 시간의이다

답변

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

경우, 당신은 단순히 다음과 같이 사용할 수 있습니다 :

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);'- 현재 날짜의 7시 40 분을 나타내는 DateTime 인스턴스를 제공합니다. 그러나 이것은 가장 효율적인 해결책이 아닙니다. – Niko

0

대신 UNIX 시간을 사용할 수 있습니다 (Jan, 1,1970 aka 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 작업을 실행하려면이 작은 스 니펫 만 있으면됩니다. –

관련 문제