模拟"请勿打扰" PHP中的功能

时间:2015-02-26 21:42:34

标签: php

我想每天在两个用户指定的时间之间进行检查,而不是运行一些函数调用(即"请勿打扰")。

例如,用户设置"请勿打扰"时间段在晚上10点到早上6点(第二天)之间。

仅供参考,最终用户不会指定日期/日期。这将每周7天,每天持续运行。

所以在晚上10点到6点(第二天)之间,任何函数调用都会被忽略。这是我到目前为止所写的内容:

$now = time(); // or $now = strtotime('11:00pm'); to simulate time to test
$start = strtotime('10:00pm');
$end = strtotime('6:00am +1 day');
// alternative time block
//$start = strtotime('10:00am');
//$end = strtotime('11:00am');

//debug
//echo date('r', $now) . '<br>' . date('r', $start) . '<br>' . date('r', $end) . '<br><br>';

if($start > $now || $now > $end) {
   echo 'disturb';
} else {
   echo 'do not disturb';
}

但这似乎不起作用,因为一旦你到了午夜,它就是新的一天,但$end变量已经是前一天。

我尝试将它放在后面一天,但问题是$end的值最终低于$start的值,这是不正确的。

每当时间到达午夜时,我也尝试在$now变量中添加一天,但问题是,如果$start$end时间相同,那该怎么办?一天?

我在这里缺少什么?

3 个答案:

答案 0 :(得分:5)

显然,您正在尝试在此处构建某种日历功能。

如果您使用strtotime('10:00pm');,则会更改为午夜后第二天的时间戳。

所以你需要给变量一个日期

 $start = strtotime('2015-02-26 10:00pm');
 $end = strtotime('2015-02-27 6:00am');

不确定如何存储这些时间块,但理想情况下它们将存储在数据库表中。

如果它每天都一样,你可以这样做:

$now = time(); // or $now = strtotime('11:00pm'); to simulate time to test
$start = strtotime('10:00pm');
$end = strtotime('6:00am'); // without the +1 day

if($start > $end) {
   if($start > $now && $now > $end) { 
      echo 'disturb';
   } else {
      echo 'do not disturb';
   }
}else{
   if($now < $start || $now > $end) { 
      echo 'disturb';
   } else {
      echo 'do not disturb';
   }
}

答案 1 :(得分:1)

我会改为转换为DateTime()个对象。然后,在结束的日子里,你不会遇到任何问题。

// obviously you'll need to feed in the date as well so
// that might involve some refactoring

$now = new DateTime();
$start = new DateTime('2015-02-26 10:00');
$end = new DateTime('2015-02-27 06:00');

现在你可以像以前一样比较。

如果您不知道日期并且您的用户仅指定时间,则可能需要动态添加日期。这些仅仅是例如。

编辑:为了应对未知的日子,你可以在今天抓住后动态生成:

$today = new DateTime();
$start = new DateTime($today->format('Y-m-d') . ' 10:00');
$end = new DateTime($today->format('Y-m-d') . ' 06:00');
$end->add(new DateInterval('P1D'));

答案 2 :(得分:1)

实际上这是一个很好的问题,

您可以使用相对较新的面向对象的方式处理时间。

我会给你链接一些信息,因为我没有时间写一个完整的例子 http://php.net/manual/en/datetime.diff.php http://php.net/manual/en/class.datetime.php http://php.net/manual/en/class.dateinterval.php

具体来自文档:

<?php
$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-13');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days');
?>

希望有所帮助