PHP检查时间范围是否在时间范围内

时间:2016-02-22 17:54:25

标签: php mysql

我想将有限时间插入数据库。 例如:Peter 13:00 - 19:00

彼得告诉我们他不能在18:00到22:00之间工作。 (这位于数据库中)。

所以13:00-19:00的时间不能插入到数据库中,因为结束时间(19:00)在18:00到22:00的时间范围内。

如何检查?

我尝试过几件事,但我不知道该怎么做。

立即了解

$van_besch = '18:00';
$tot_besch = '22:00';

$van = '13:00';
$tot = '19:00';

if (($van_besch >= $van) && ($tot_besch <= $tot)) {
        $error ='<font color="red">Time '.$van_besch.' - '.$tot_besch.' Not available</font>';
    }

这不会奏效。

感谢阅读!

3 个答案:

答案 0 :(得分:2)

实际上有两种情况需要检查:

  1. $van相等或介于$van_besch$tot_besch之间

  2. $tot相等或介于$van_besch$tot_besch之间

  3. 如果$van$tot都在$van_besch$tot_besch之间,则两种情况都属实。

    您还需要处理跨越休息时间的轮班,例如: 17:00 - 02:00另一个问题是您需要处理的是20:00 - 0:00,因为0:00小于20:00。

    因此,我们将实时投影到我们自己的时间格式。 这意味着17:00 - 02:00将成为17:00 - 26:00。请注意,我们需要为$van_besch - $tot_besch$van - $tot$执行此操作。

    在代码中看起来像:

    if ($tot < $van){
       $tot = 24:00 - $van + $tot;
    }
    
    if ($tot_besch < $van_besch){
       $tot = 24:00 - $van + $tot;
    }
    
    if (($van >= $van_besch) && ($van <= $tot_besch) ) || (($tot >= $tot_besch) && ($tot <= $tot_besch)){
     ... Peter is not available ... 
    }
    

答案 1 :(得分:0)

最好转换它们并使用strtotime进行比较。这样的事情对你有用:

$van_besch = '18:00';
$tot_besch = '22:00';

$van = '13:00';
$tot = '19:00';

if (strtotime($van) < strtotime($van_besch) || strtotime($tot ) > strtotime($tot_besch)) {
   //code goes here
}

答案 2 :(得分:-1)

您可以在SQL查询中确定这一点。如果您只是存储时间,最好将其作为int 0000 - 2359

所以我们的表看起来像这样。

CREATE TABLE off_time (
  id int(12) AUTO_INCREMENT,
  employee int(12) NOT NULL,
  start_time smallInt(4) unsigned NOT NULL,
  end_time smallInt(4) unsigned NOT NULL,
  PRIMARY KEY (id)
);

我们正在存储一个开始和结束时间,以创建一个他们无法工作的时间块。显然,在您的代码中,确保这些块有意义并且start_time&lt; = end_time。

非常重要。

现在我们可以查询。

// Here we use just < and > but you can make them <= and >= if you don't want time slots to possibly overlap start/end times.
SELECT ot.id, IF( 1300 < ot.end_time AND 1900 > ot.start_time, 1, 0) AS blocked
FROM off_time as ot
WHERE ot.employee = 1; 

您将获得一个表格,其中每一行将包含被阻止的时段的id,而blocked列为1表示已被阻止,0表示不是。因此,如果任何条目为1,那么您就知道您的时间被阻止了。这样做也很方便,因为您还可以关联原因表,并能够回答原因。 LEFT JOIN time_off_reasons as r on r.id = ot.id

如果您想特定日期。只需存储timestamp开始和结束时间。比较将是相同的,只是改为时间戳。

修改 Marc B.在关于时间块的评论中提出了一个很好的观点,这些时间块延伸到午夜标记,即2200 - 0200.使用我的方法,你可以确保将它们分开作为单独的条目。

所以INSERT INTO off_time (start_time, end_time) VALUES(2200, 2400)(0000,0200)

这仍然可以按预期工作。但是你只需要两个条目一次性关闭块,这可能很烦人,但仍然比编写额外的代码来补偿逻辑更容易。