我有一个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代码?
答案 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";
}
?>