【问题标题】:Conditional based on day of week and time range基于星期几和时间范围的条件
【发布时间】:2019-11-19 11:39:28
【问题描述】:

我正在尝试根据星期几和当天的时间范围找到条件的解决方案。我设法找到了一周中某一天的代码,但我找不到如何在一天中合并时间范围?

例如:

IF today is Monday AND between 2pm and 4pm THEN do THIS

这就是我所拥有的……

<?php   
date_default_timezone_set('Australia/Perth'); // PHP supported timezone
$script_tz = date_default_timezone_get();
// get current day:
$currentday = date('l'); ?>
<?php if ($currentday == Monday){ ?>
Monday
<?php } elseif ($currentday == Tuesday){ ?>
Tuesday
<?php } elseif ($currentday == Wednesday){ ?>
Wednesday
<?php } elseif ($currentday == Thursday){ ?>
Thursday
<?php } elseif ($currentday == Friday){ ?>
Friday
<?php } elseif ($currentday == Saturday){ ?>
Saturday
<?php } elseif ($currentday == Sunday){ ?>
Sunday
<?php } else { ?>
<?php } ?>

我不确定这对时间框架是否有帮助? Check day of week and time

【问题讨论】:

    标签: php if-statement time conditional-statements dayofweek


    【解决方案1】:

    基本上是这样的:

    <?php
    
    if (date('l') === 'Monday' && date('G') >= 2 && date('G') < 4) {
        // do something
    }
    
    

    您在日期名称周围缺少引号。

    我写的条件将在星期一下午 2 点到 4 点之间评估为真(而下午 4 点本身不会,例如,最后允许的值是下午 3:59)。

    【讨论】:

    • 简单干净。
    【解决方案2】:

    您可以使用不同的日期/时间组件来简化代码:

    function between($value, $start, $end)
    {
        return $value > $start && $value <= $end;
    }
    
    $hours = date("G");
    
    switch( date("N"))
    {
        case 1:  //monday
            if (between($hours,12 + 2,12 + 4 )) //using 24h format to avoid checking am/pm
            {
                // IF today is Monday AND between 2pm and 4pm THEN do THIS
            }
        break;
    
        case 2: //tuesday
        break;
    
    
        //....
    
    }
    

    【讨论】:

      【解决方案3】:

      您最好使用date('N'),因为它不依赖于语言,而date('H') 则可以利用更适合时间比较的 24 小时格式。

      function date_in_frame($test_date, $day, $start, $end){
          $d = new Datetime($test_date);
          return $d->format("N") == $day && $d->format("H") >= $start && $d->format("H") < $end;
      }
      //test if "now" is Monday between 2pm (14:00) and 4pm (15:59)
      var_dump(date_in_frame("now", 0, 14, 16));
      

      【讨论】:

        【解决方案4】:

        这里的代码检查 DateTime 是否在开始时间和结束时间之间。

        <?php
        
        $date = new DateTime('2019-11-18 12:49');
        
        $start = new DateTime('2019-11-18 09:00');
        $end = new DateTime('2019-11-18 17:00');
        
        if ($date > $start && $date < $end) {
            echo 'In the zone!';
        }
        

        注意。

        $date-&gt;format('l'); 将在星期一或任何一天返回。

        $date-&gt;format('H:i'); 将返回 13:15 或任何时间。

        玩! https://3v4l.org/XK5KR

        【讨论】:

        • 我正在寻找星期几和时间,而不是日期。
        • 您可以使用format('H:i') 获取小时和时间,H 表示小时,i 表示分钟。更新了答案。您仍然可以使用 DateTime 对象进行比较,但如果需要,请使用格式来获​​取细节
        【解决方案5】:

        将所有条件打包到一个数组中更容易维护。

        一个简化的例子:

        $ranges = [
          ['Monday',12,14, function(){echo "do something";}],
          ['Tuesday',12,14, function(){echo "do something on Tue";}],
          //: more
        ];
        
        $curWeekDay = date('l');
        $hours = date("G");
        foreach($ranges as $range){
          if($curWeekDay == $range[0] AND $hours >= $range[1] AND $hours < $range[2]){
            $range[3]();
          }
        } 
        

        周二 13:25 输出:

        do something on Tue 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-15
          • 1970-01-01
          • 1970-01-01
          • 2022-09-26
          • 1970-01-01
          相关资源
          最近更新 更多