【问题标题】:current time lies between time range当前时间介于时间范围之间
【发布时间】:2017-08-11 08:06:12
【问题描述】:

我需要检查当前时间是否在范围内

these r restaurant open timings ,timings can be like open now till next morning or closed for sometime same day and open next half same day till next day or midnight      
 examples

        Case1: 10:00  01:00
        Case2: 10:00  23:59
        Case3: 10:00  00:00
        Case4: 23:59  05:00
        Case5: 08:35  15:30 && 17:30 02:00
       Case6: 10:00  15:00 && 17:00 00:00

必须检查所有情况

       if((strtotime($s)<=strtotime($myTime)) && (strtotime($e)>=strtotime($myTime)))   
          {$open =1;}
      if($e=="00:00")                                                        
        { if((strtotime($s)<=strtotime($myTime))&& (strtotime($myTime)>=strtotime("00:00")))    
            {$open =1;}}

这在我出错的地方不起作用

【问题讨论】:

  • 第一种情况,第二行是次日还是9小时前的同一天?
  • 我推荐使用 DateTime 对象。将您的“案例”存储在 DateTime 对象中并将它们与当前日期进行比较。有关示例,请参阅stackoverflow.com/questions/961074/…。
  • @131 不同的日子不同的例子 5/6 可以是一整天的时间
  • @user1915746 问题是我必须将范围与当前时间进行比较
  • @hir:我发布了一个示例作为答案。

标签: php time range strtotime


【解决方案1】:

这样的事情可能会奏效。我还没有真正测试过。

$currentTime = time();
function in_range($what, $min, $max) {
    return $what >= $min && $what <= $max;
}

var_dump(in_range($currentTime, strtotime('08:35'), strtotime('15:30'));
// etc.

【讨论】:

  • 当第二次小于第一次时,你预计会在第二天吗?例如 - 使用“10:00 到 00:00” - 是在今天早上 10:00 到今晚午夜之间 - 还是应该是昨晚的午夜?
  • 今天早上和今晚午夜 -- 这些餐厅的营业时间
【解决方案2】:

像这样使用 DateTime 对象进行比较。见http://php.net/manual/en/class.datetime.php

$cases = array(
        array(
                'start' => new DateTime("10:00:00"),
                'end' => new DateTime("12:00:00"),
        ),              
        array(
                'start' => new DateTime("10:00:00"),
                'end' => new DateTime("23:59:00"),

        ),
        array(
                'start' => new DateTime("10:00:00"),
                'end' => new DateTime("00:00:00"),

        ),
        array(
                'start' => new DateTime("23:59:00"),
                'end' => new DateTime("05:00:00"),

        ),
);

//adjust dates
$cases[2]['end']->modify('+1 day');
$cases[3]['start']->modify('-1 day');

$now = new DateTime();
foreach ($cases as $key => $value) {
    if ($now > $value['start'] && $now < $value['end']) {
        echo 'case ' . $key  . ' ok' . PHP_EOL; 
    }
    else {
        echo 'case ' . $key  . ' out of range' . PHP_EOL;
    }
}

【讨论】:

  • @hir:查看我的更新答案。您可以调整案例数组中的日期。您的案例 5 和 6 只是两个单一案例的组合。
【解决方案3】:

对-o,给你弄得一团糟。你想看看这是否得到了你的预期输出?似乎正在处理我的本地测试。有点代码头脑,结果是一些需要考虑的边缘情况。

可能有一些可以重构和改进的部分,但如果它按预期工作,我会留给你。

<?php
$cases = [
    [['start' => '09:00', 'end' => '01:00']],
    [['start' => '10:00', 'end' => '23:59']],
    [['start' => '10:00', 'end' => '00:00']],
    [['start' => '23:59', 'end' => '05:00']],
    [['start' => '10:00', 'end' => '15:00'], ['start' => '17:30', 'end' => '02:00']],
    [['start' => '10:00', 'end' => '15:00'], ['start' => '17:30', 'end' => '00:00']],
];

$cases = setUpCases($cases);

foreach ($cases as $case) {
    $withinTimeRange = isTimeWithinCase((new DateTime()), $case);
    if ($withinTimeRange) {
        break;
    }
}

// Boolean True/False whether it is within any of the ranges or not.
// i.e. True = Shop Open, False = Shop closed.
var_dump($withinTimeRange); 


function setUpCases($cases) {
    return array_map(function($case) {
        return convertToDateTimeObjects($case);
    }, $cases);
}

function convertToDateTimeObjects($case) {
    $formatted = [];
    foreach ($case as $index => $times) {
        $s = new DateTime();
        list($hour, $minute) = explode(':', $times['start']);
        $s->setTime($hour, $minute, 00);

        $e = new DateTime();
        list($hour, $minute) = explode(':', $times['end']);
        $e->setTime($hour, $minute, 00);

        if ($e < $s) $e->modify('+1 day');

        $formatted[] = ['start' => $s, 'end' => $e];
    }

    return $formatted;
}

function isTimeWithinCase($time, $case) {
    foreach ($case as $timerange) {
        return ($time > $timerange['start'] && $time < $timerange['end']);
    }
}

【讨论】:

    【解决方案4】:

    我一直在仔细考虑这项任务。我想出了计算当前时间是否在 2 次之间所需的逻辑。有以下两种情况来计算:

    案例一:开始时间大于结束时间

    这意味着结束时间必须是第二天。这意味着如果您的当前时间小于结束时间OR 大于开始时间,则您的时间介于两者之间。

    案例2:开始时间小于结束时间

    在这种情况下,开始时间和结束时间是同一天。为此,需要的逻辑是检查您的时间是否大于开始时间AND 小于结束时间。如果这句话是真的,那么您的时间介于两者之间。

    我已经做了以下计算函数:

    function checktime($arr,$time) {
        list($h,$m)=explode(":",$time);
        if(!is_array($arr[0])) {
            $r1=explode(":",$arr[0]);
            $r2=explode(":",$arr[1]);
            
            if($r1[0]>$r2[0]) {
                if(($h>$r1[0] || ($h==$r1[0] && $m>=$r1[1])) || ($h<$r2[0] || ($h==$r2[0] && $m<=$r2[1]))) return true;
            }
            else {
                if(($h>$r1[0] || ($h==$r1[0] && $m>=$r1[1])) && ($h<$r2[0] || ($h==$r2[0] && $m<=$r2[1]))) return true;
            }
        }
    }
    

    这里有一些测试,用于测试你给我的案例的极限:

    $arr=array("10:00","01:00");
    echo (checktime($arr,"23:59")?"True":"False");//True
    echo (checktime($arr,"12:00")?"True":"False");//True
    echo (checktime($arr,"00:00")?"True":"False");//True
    
    $arr=array("10:00","23:59");
    echo (checktime($arr,"23:59")?"True":"False");//True
    echo (checktime($arr,"12:00")?"True":"False");//True
    echo (checktime($arr,"00:00")?"True":"False");//False
    
    $arr=array("10:00","00:00");
    echo (checktime($arr,"23:59")?"True":"False");//True
    echo (checktime($arr,"12:00")?"True":"False");//True
    echo (checktime($arr,"00:00")?"True":"False");//True
    
    $arr=array("23:59","05:00");
    echo (checktime($arr,"23:59")?"True":"False");//True
    echo (checktime($arr,"12:00")?"True":"False");//False
    echo (checktime($arr,"00:00")?"True":"False");//True
    
    $arr=array("08:35","15:30");
    echo (checktime($arr,"23:59")?"True":"False");//False
    echo (checktime($arr,"12:00")?"True":"False");//True
    echo (checktime($arr,"00:00")?"True":"False");//False
    
    $arr=array("17:30","02:00");
    echo (checktime($arr,"23:59")?"True":"False");//True
    echo (checktime($arr,"12:00")?"True":"False");//False
    echo (checktime($arr,"00:00")?"True":"False");//True
    
    $arr=array("10:00","15:00");
    echo (checktime($arr,"23:59")?"True":"False");//False
    echo (checktime($arr,"12:00")?"True":"False");//True
    echo (checktime($arr,"00:00")?"True":"False");//False
    
    $arr=array("17:00","00:00");
    echo (checktime($arr,"23:59")?"True":"False");//True
    echo (checktime($arr,"12:00")?"True":"False");//False
    echo (checktime($arr,"00:00")?"True":"False");//True
    

    【讨论】:

      【解决方案5】:

      这适用于所有情况

             $let=array("01:00","02:00","03:00","05:00","04:00");                          
             if((strtotime($s)<=strtotime($myTime)) && (!strcmp($e,"00:00"))) 
                                  { $open=1;$flag=1;}
             if((strtotime($s)<=strtotime($myTime)) && (!strcmp($e,"23:59"))) 
                                  {  $open=1;$flag=1;}                               
            if(in_array($e,$let))
              {
               if(strtotime($s)<=strtotime($myTime))
                  { $open=1;$flag=1;}
               else
               if(strtotime($e)>=strtotime($myTime))
                  { $open=1;$flag=1;}                                 
              }
              if(!$flag)
                  {if((strtotime($s)<=strtotime($myTime)) && (strtotime($e)>=strtotime($myTime)))
                   { $open=1;}    }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-28
        • 2017-02-10
        • 1970-01-01
        相关资源
        最近更新 更多