PHP-检查时间是否在22:00和02:00之间

时间:2018-12-28 12:53:13

标签: php datetime

我有以下代码:

$now = date('2018-12-28 23:00:00');
$begintime = new DateTime('22:00');
$endtime = new DateTime('03:00');

if($now >= $endtime && $now <= $begintime){
// not between times
echo "Run";
} else {
// between times
echo "Skip";
}

回声是

Skip

因为$now$begintime大,使得输出为false
知道时间是否不在$begintime$endtime之间的正确方法是什么?
我搜索了所有相关问题,由于这个问题,我浪费了我三天的时间,但找不到任何东西可以甚至从这个论坛和Google身上找到任何信息。请帮助我,这个问题离我的生活已经荒唐了几天,对我以前的英语感到抱歉。.:D

3 个答案:

答案 0 :(得分:1)

您的代码显示出对工作方式的大量误解,并导致了问题。请查看官方文档,您将看到date()返回字符串,而DateTime是一个对象。无法直接比较它们,您需要事先将它们转换为可比较的类型。还要注意,DateTime希望获得一个日期,而不仅仅是时间。实际上没有定义日期,您的$endtime实际上比$starttime小:

$begintime = new DateTime('22:00');
$endtime = new DateTime('03:00');

echo $begintime < $endtime ? 'Yes':'No';

此代码段将返回No

您需要将$now转换为DateTime,并且需要在开始/结束时间标记中添加日期。例如:

$now = \DateTime::createFromFormat('Y-m-d H:i:s', '2018-12-28 23:00:00', new \DateTimeZone('UTC'));

我无法提供转换开始/结束时间标记的示例,因为您尚未定义它们实际需要的外观。

答案 1 :(得分:0)

一种解决方案可能是:

$now = "23:00"; // date ('H:i');
$begintime = "22:00";
$endtime = "03:00";

$now_t = DateTime::createFromFormat('H:i', $now);
$begintime_t = DateTime::createFromFormat('H:i', $begintime);
$endtime_t = DateTime::createFromFormat('H:i', $endtime);

if ($now_t > $begintime_t || $now_t < $endtime_t)
{
 echo "Skip";
}
else
{
 echo "Run";
}

答案 2 :(得分:0)

更新

最后,我解决了我的问题..
有人可以从我的问题中删除重复的标签并找到此问题的正确标题吗?也许像我一样有同样问题的人可以搜索我的问题并找到答案。
对不起,我的英语,我还在学习。.

// this is variable from mysql database
$mysql_start = "2018-12-28 21:45:00";  // its from mysql DATETIME and time show when this script will be run
$begintime = "22:00"; // user can choose when this script stop
$endtime = "20:00"; // user can choose when this script run


$mysql_start = explode(' ', $mysql_start);
$taskdays = $mysql_start[0]; // 2018-12-28
echo $taskhours = $mysql_start[1]; // 21:45:00
echo "<br>";
$taskhours = explode(':',$taskhours);
$taskhours = $taskhours[0]; // 22
echo $begintime = date($begintime);
echo "<br>";
$begintime = explode(':',$begintime);
$begintime = $begintime[0]; // 20
echo "<br>";
echo $endtime = date($endtime);
echo "<br>";
$endtime = explode(':',$endtime);
$endtime = $endtime[0] - 1; // because if endtime is 6, so if its 05:59, the endtime will be end on 05
echo $endtime = str_pad($endtime, 2, '0', STR_PAD_LEFT); // if 6, it will add 0 so it will be 06
echo "<br>";
$jamarray = array("00","01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23");
$ray = array();
if ($begintime > $endtime){
    echo '$begintime is bigger than $endtime<br>';
foreach($jamarray as $ray) {
        if($ray >= $begintime or $ray <= $endtime){
            //echo '<br>';
            //print_r($ray);
            $eray[] = $ray;
        }
}
$aslinya = array_diff($jamarray,$eray); 
print_r($aslinya);
if (in_array($taskhours, $aslinya))
  {
  echo " <= script run in this time";

  }

}else{

    echo '$begintime is less than $endtime<br>';
foreach($jamarray as $ray) {
        if($ray >= $begintime and $ray <= $endtime){
            //echo '<br>';
            //print_r($ray);
            $eray[] = $ray;
        }
}
$aslinya = array_diff($jamarray,$eray);
print_r($aslinya);
if (in_array($taskhours, $aslinya))
  {
  echo " <= script run in this time";
  } 


}
相关问题