2012-03-11 21 views
0

私は5分ごとにキックをするクローンを持っています。 1日の特定の時間(朝や夕方など)にのみタスクを実行する必要があります。日時が時間枠内にあるかどうかを確認する最も効果的な方法

現在のDateTimeが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は同様に、DateTime型である

答えて

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ジョブごとにコードを書き直すことなくいつでも使うことができるので、より適応性があります($ post == 21 &&($ min> = 00)。 && $ min <05)。したがって、1日に10個のcronジョブを実行する場合は、この小さなスニペットが必要です。 –

関連する問題