【问题标题】:Partion 20 min slot of time in php from start and end time从开始到结束时间在 php 中分区 20 分钟很多时间
【发布时间】:2016-01-20 06:27:42
【问题描述】:

前->

 Start time = 2015-10-21 09:00:00
 end time  = 2015-10-21 19:45:00

所以按照我的例子 - 开始时间是9 am to 7-45pm

所以我想要 20 分钟的可能时段。在 php 中像

9:00 - 9:20 , 9-20 to 9-40 etc。但也为ex 12:00-12:20 , 2:40 to 2:60 预订,则它不会包含在此列表中。

我想制作 20 分钟的广告位。是的,但它也会过滤 alr

使用 php 中的时差,我有开始时间和结束时间。

然后我想检查从开始到结束时间有多少个 20 分钟的时间段

=> 它还会检查某个时间段是否已经预订,然后不考虑它

IN SHOT 1 to 2 or 3-5 is break time then it will not consider. 

【问题讨论】:

标签: javascript php codeigniter datetime time


【解决方案1】:

这将满足您的需求。但数组元素应保留特定格式,以便于计算。

<?php
$start_time = '2015-10-21 09:00:00';  //start time as string
$end_time = '2015-10-21 19:45:00';  //end time as string
$booked = array('12:20-12:40','13:00-13:20');    //booked slots as arrays
$start = DateTime::createFromFormat('Y-m-d H:i:s',$start_time);  //create date time objects
$end = DateTime::createFromFormat('Y-m-d H:i:s',$end_time);  //create date time objects
$count = 0;  //number of slots
$out = array();   //array of slots 
for($i = $start; $i<$end;)  //for loop 
{
$avoid = false;   //booked slot?
$time1 = $i->format('H:i');   //take hour and minute
$i->modify("+20 minutes");      //add 20 minutes
$time2 = $i->format('H:i');     //take hour and minute
$slot = $time1."-".$time2;      //create a format 12:40-13:00 etc
    for($k=0;$k<sizeof($booked);$k++)  //if booked hour
    {
    if($booked[$k] == $slot)  //check
    $avoid = true;   //yes. booked
    }
if(!$avoid && $i<$end)  //if not booked and less than end time
{
$count++;           //add count
$slots = ['start'=>$time1, 'stop'=>$time2];         //add count
array_push($out,$slots); //add slot to array
}
}
var_dump($out);   //array out
echo $count ." of slots available";

如果您使用预定的日期时间作为数组,请使用以下代码。

<?php
$start_time = '2015-10-21 09:00:00';  //start time as string
$end_time = '2015-10-21 19:45:00';  //end time as string
$booked = ['2015-10-21 12:20:00','2015-10-21 12:40:00', '2015-10-21 13:00:00','2015-10-21 13:20:00'];
     //booked slots as arrays
$start = DateTime::createFromFormat('Y-m-d H:i:s',$start_time);  //create date time objects
$end = DateTime::createFromFormat('Y-m-d H:i:s',$end_time);  //create date time objects
$time1 = $start;
$count = 0;  //number of slots
$out = array();   //array of slots 
for($i = $start; $i<$end;)  //for loop 
{
$avoid = false; 
$t1 = date_timestamp_get($i);
$t2 = $t1+(20*60);

    for($k=0;$k<sizeof($booked);$k+=2)  //if booked hour
    {
    $st = DateTime::createFromFormat('Y-m-d H:i:s',$booked[$k]);
    $en = DateTime::createFromFormat('Y-m-d H:i:s',$booked[$k+1]);

    if( $t1 >= date_timestamp_get($st) && $t2 <= date_timestamp_get($en)  )
    $avoid = true;   //yes. booked
    }
$slots =[ $i->format('H:i'),$i->modify("+20 minutes")->format('H:i')];
if(!$avoid && $i<$end)  //if not booked and less than end time
{
$count++;  
array_push($out,$slots);  //add slot to array
}
}
var_dump($out);   //array out
echo $count ." of slots available";

【讨论】:

  • 您好,谢谢。而不是字符串。我有预订的开始和结束时间不同的字段。新书也一样。所以你能改变它吗?再次感谢:)
  • 我的数据库有日期时间格式,所以我使用预定的日期时间作为 => 例如。预订时间 b_start = 2015-10-21 12:00:00 b_end = 2015-10-21 12:30:00 和插槽相同我想要不同变量的开始插槽和结束插槽,所以我只能在输出中打印开始时间.并在数据库中提交不同的开始和结束。非常感谢:)
  • inshort 在您给定的插槽中 - 插槽是正确的,但我希望开始时间和结束时间作为数组中的变量,以便我可以将其保存在我的数据库中。预订开始时间的功能相同。 2015-10-21 01:00:00 所以它的一个字段和第二个字段是 2015-10-21 01:30:00 谢谢所以简而言之,我想要带有开始和结束变量的插槽,并且从选择查询中得到相同的开始和结束预订上述日期时间格式中的时间。谢谢
  • INSHORT 我有 2 种类型的插槽,就像我有 2 次服务一样,它有 40 分钟的插槽,所以系统将制作 40 分钟的插槽,但我会避免 20 分钟的预订插槽。所以请考虑这也感谢它的最终结果。查询
  • 好的,谢谢插槽现在很好。但我想如果我设置 12-30 没有插槽,那么我不想要包含这个时间的插槽。现在它不过滤预订时间。 Bcz 收到此警告警告:date_timestamp_get() 期望参数 1 为 DateTime,第 22 行中给出的布尔值
【解决方案2】:

您必须在每次增加start time 20 分钟的同时将slops 循环到最后一个sloop(小于或等于end time)并将其添加到数据数组中。

您可以在 PHP 文档页面上查看更多关于我使用的函数的信息:strtotimedate

<?php

    $start_time = strtotime('2015-10-21 09:00:00');
    $end_time = strtotime('2015-10-21 19:45:00');
    $slot = strtotime(date('Y-m-d H:i:s',$start_time) . ' +20 minutes');

    $data = [];

    for ($i=0; $slot <= $end_time; $i++) { 

        $data[$i] = [ 
            'start' => date('Y-m-d H:i:s', $start_time),
            'end' => date('Y-m-d H:i:s', $slot),
        ];

        $start_time = $slot;
        $slot = strtotime(date('Y-m-d H:i:s',$start_time) . ' +20 minutes');
    }

    print_r($data);

?>

【讨论】:

  • 是的,我会看,但除此之外,我还想不包括预订时间。比如如果 ex 12:00-12:20 , 2:40 to 2:60 被预订,那么它不会包含在这个列表中。
  • 如果你不知道如何改变数组然后去谷歌看看一些 php 基础教程......
  • 虽然这段代码 sn-p 可以解决问题,including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
  • @whyguy 谢谢,但是。如果他们被预订并且没有进入我的阵列,你能以 2 个时间段为例。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多