【问题标题】:php carbon check if now is between two times (10pm-8am)php carbon 检查现在是否在两次之间(晚上 10 点到早上 8 点)
【发布时间】:2018-01-02 00:40:25
【问题描述】:
$start = '22:00:00';
$end = '08:00:00';
$now = Carbon::now('UTC');

如何查看$now的时间是否在时间范围内?

【问题讨论】:

  • 如果$start和$end在同一天,$now不在范围内。

标签: php php-carbon


【解决方案1】:

@AliN11 的(目前是最热门的)答案很好,但并不像人们期望的那样工作,午夜过后它就会中断,正如 @Sasha 在 cmets 中提出的那样

解决办法是把逻辑颠倒过来,检查倒数之间的时间是否

这是一种可以按预期工作的替代方法:

    $now = Carbon::now();
    $start = Carbon::createFromTimeString('08:00');
    $end = Carbon::createFromTimeString('22:00');

    if (! $now->between($start, $end)) {
        // We're all good
    }

【讨论】:

    【解决方案2】:

    对于支持所有开始和结束时间范围的完整解决方案,您可以使用按位XOR

    /*
     * must using hours in 24 hours format e.g. set 0 for 12 pm, 6 for 6 am and 13 for 1 pm
     */
    private $startTime = '0';
    private $endTime = '6';
        
    
    $currentHour = \Carbon\Carbon::now()->hour;
    $start = $this->startTime > $this->endTime ? !($this->startTime <= $currentHour) : $this->startTime <= $currentHour;
    $end = $currentHour < $this->endTime;
    
    
    if (!($start ^ $end)) {
      //Do stuff here if you want exactly between start and end time
    }
    

    【讨论】:

      【解决方案3】:

      你可以逆向检查算法。

      <?php
      $pushChannel = "general";
      
      $now = Carbon::now();
      
      $start = Carbon::createFromTime(8, 0);
      $end = Carbon::createFromTime(22, 0);
      
      if (!$now->between($start, $end)) {
           $pushChannel = "silent";
      

      【讨论】:

        【解决方案4】:

        有几种方法可以通过使用 Carbon 来实现。最简单的方法之一是使用createFromTimeStringbetween 方法:

        $now = Carbon::now();
        
        $start = Carbon::createFromTimeString('22:00');
        $end = Carbon::createFromTimeString('08:00')->addDay();
        
        if ($now->between($start, $end)) {
            // ¯\_(ツ)_/¯
        }
        

        【讨论】:

        • 对于每个人,谁看这个。请记住,createFromTimeString 方法将始终从时钟(如时间输入)返回当前日期。当你过了午夜时,这真的会成为一个问题。然后在这个例子中,突然第二天和后天将成为目标日期和时间。因此,您必须将日期字符串放入方法参数并通过数据库或文件更新/存储它。
        【解决方案5】:

        克里斯试图指出的是,如果结束时间超过了午夜,那么你必须考虑到这一点。

        这不是最干净的方法,但这是一种似乎可行的方法。

        private function isNowBetweenTimes($timezone, $startDateTime, $endDateTime) {
            $curTimeLocal = Carbon::now($timezone);
            $startTime = $curTimeLocal->copy();
            $startTime->hour = $startDateTime->hour;
            $startTime->minute = $startDateTime->minute;
            $endTime = $curTimeLocal->copy();
            $endTime->hour = $endDateTime->hour;
            $endTime->minute = $endDateTime->minute;
            if ($endTime->lessThan($startTime))
                $endTime->addDay();
        
            return ($curTimeLocal->isBetween($startTime, $endTime));
        }
        

        这个例子只关心小时和分钟,而不是秒,但你也可以轻松地复制它。这样做的关键是在将开始和结束时间与当前时间进行比较之前比较它们,如果结束时间小于开始时间,则在结束时间添加一天。

        【讨论】:

          【解决方案6】:

          试试这个:

          $start = 22; //Eg. start hour
          $end = 08;  //Eg. end hour
          $now = Carbon::now('UTC');
          
          if( $start < $now->hour && $now->hour < $end){
              // Do something
          }
          

          【讨论】:

          • 这不是有效的 php
          【解决方案7】:

          试试这个:

            $time = Carbon::now();
            $morning = Carbon::create($time->year, $time->month, $time->day, 8, 0, 0); //set time to 08:00
            $evening = Carbon::create($time->year, $time->month, $time->day, 18, 0, 0); //set time to 18:00
            if($time->between($morning, $evening, true)) {
              //current time is between morning and evening
            } else {
              //current time is earlier than morning or later than evening
            }
          

          $time-&gt;between($morning, $evening, true) 中的true 检查$time 是否介于$morning$evening 之间。如果你写false,它会检查它是否在两次之间但不包括。

          实际上,您可以不使用true,因为它是默认设置的,不需要。

          查看here,了解有关如何使用 Carbon 比较日期和时间的更多信息。

          【讨论】:

            【解决方案8】:
            $start = '22:00:00';
            $end   = '08:00:00';
            $now   = Carbon::now('UTC');
            $time  = $now->format('H:i:s');
            
            if ($time >= $start && $time <= $end) {
                ...
            }
            

            应该这样做,但不考虑日期

            【讨论】:

            • 您的 OR 逻辑错误。它应该是 AND。如果现在是 13:00:00 并且范围是 12:00:00 到 12:45:00,那么您的解决方案将回答是,因为 $time 实际上 >= $start。
            • 如果你认为时间是“23:00:00”,你的逻辑就错了。
            • @Hamidreza 需要解释一下吗? “23:00:00”大于“22:00:00”的开始时间,所以逻辑检查给我
            【解决方案9】:
            $restrictStartTime = Carbon::createFromTime(22, 0, 0);  //carbon inbuild function which will create todays date with the given time
            $restrictEndTime = Carbon::createFromTime(8, 0, 0)->addDays(1); //this will create tomorrows date with the given time
            $now = Carbon::now();
            
            if($now->gt($restrictStartTime) && $now->lt($restrictEndTime)) {
             .....
             }
            

            【讨论】:

            • 虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
            • 我建议你解释一下如何将$start = '22:00:00';位自动转换成你提出的$restrictStartTime = Carbon::createFromTime(22, 0, 0);
            【解决方案10】:
            <?php
            $now = date("H");
            
            if ($now < "20") {
                echo "Have a good day!";
            }
            

            【讨论】:

            • 不解决日期范围问题(即 $now > $start && $now
            【解决方案11】:

            请尝试以下代码,

            $start = '22:00:00';
            $end = '08:00:00';
            $now = Carbon::now('UTC');
            
            $nowTime = $now->hour.':'.$now->minute.':'.$now->second;
            
            if(strtotime($nowTime) > strtotime($start) && strtotime($nowTime) < strtotime($end) ) {
                echo 'YES';
            } else {
                echo 'NO';
            }
            

            【讨论】:

            • 不解决日期范围问题(即$now > $start && $now
            • 其实你要范围时间吗?不是吗?请再次尝试回答代码。如果不能解决,请描述我。
            猜你喜欢
            • 2013-05-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多