【发布时间】: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
$start = '22:00:00';
$end = '08:00:00';
$now = Carbon::now('UTC');
如何查看$now的时间是否在时间范围内?
【问题讨论】:
标签: php php-carbon
@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
}
【讨论】:
对于支持所有开始和结束时间范围的完整解决方案,您可以使用按位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
}
【讨论】:
你可以逆向检查算法。
<?php
$pushChannel = "general";
$now = Carbon::now();
$start = Carbon::createFromTime(8, 0);
$end = Carbon::createFromTime(22, 0);
if (!$now->between($start, $end)) {
$pushChannel = "silent";
【讨论】:
有几种方法可以通过使用 Carbon 来实现。最简单的方法之一是使用createFromTimeString 和between 方法:
$now = Carbon::now();
$start = Carbon::createFromTimeString('22:00');
$end = Carbon::createFromTimeString('08:00')->addDay();
if ($now->between($start, $end)) {
// ¯\_(ツ)_/¯
}
【讨论】:
createFromTimeString 方法将始终从时钟(如时间输入)返回当前日期。当你过了午夜时,这真的会成为一个问题。然后在这个例子中,突然第二天和后天将成为目标日期和时间。因此,您必须将日期字符串放入方法参数并通过数据库或文件更新/存储它。
克里斯试图指出的是,如果结束时间超过了午夜,那么你必须考虑到这一点。
这不是最干净的方法,但这是一种似乎可行的方法。
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));
}
这个例子只关心小时和分钟,而不是秒,但你也可以轻松地复制它。这样做的关键是在将开始和结束时间与当前时间进行比较之前比较它们,如果结束时间小于开始时间,则在结束时间添加一天。
【讨论】:
试试这个:
$start = 22; //Eg. start hour
$end = 08; //Eg. end hour
$now = Carbon::now('UTC');
if( $start < $now->hour && $now->hour < $end){
// Do something
}
【讨论】:
试试这个:
$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->between($morning, $evening, true) 中的true 检查$time 是否介于$morning 和$evening 之间。如果你写false,它会检查它是否在两次之间但不包括。
实际上,您可以不使用true,因为它是默认设置的,不需要。
查看here,了解有关如何使用 Carbon 比较日期和时间的更多信息。
【讨论】:
$start = '22:00:00';
$end = '08:00:00';
$now = Carbon::now('UTC');
$time = $now->format('H:i:s');
if ($time >= $start && $time <= $end) {
...
}
应该这样做,但不考虑日期
【讨论】:
$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)) {
.....
}
【讨论】:
$start = '22:00:00';位自动转换成你提出的$restrictStartTime = Carbon::createFromTime(22, 0, 0);
<?php
$now = date("H");
if ($now < "20") {
echo "Have a good day!";
}
【讨论】:
请尝试以下代码,
$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';
}
【讨论】: