PHP - проверьте время между 22:00 и 02:00 - PullRequest
0 голосов
/ 28 декабря 2018

у меня есть следующий код:

$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
как правильно узнать, если время не между 1011 * и $endtime?
Я искал все соответствующие проблемы, и я просто потратил 3 дня своей жизни из-за этих проблем,но не смог найти что-то, что даже объяснило бы что-нибудь из этого форума и Google для меня.Пожалуйста, помогите мне, эта проблема уже заняла абсурдное количество дней в моей жизни и извините за мой английский прежде ..: D

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Одно решение может быть:

$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";
}
0 голосов
/ 30 декабря 2018

ОБНОВЛЕНИЕ

В конце концов, я решаю свою проблему ..
Может кто-нибудь удалить дубликаты тегов из моего вопроса и найти правильный заголовок для этой проблемы?может быть, кто-то, кто имеет такую ​​же проблему, как я, может найти мой вопрос и найти ответ ..
извините за мой английский, я все еще учусь ..

// 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";
  } 


}
0 голосов
/ 28 декабря 2018

Ваш код отображает огромное количество неправильного понимания того, как все работает, и это приводит к проблеме.Пожалуйста, посмотрите на официальную документацию, вы увидите, что 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'));

Я не могу привести пример преобразования меток времени начала / конца, потому что вы не определили, как они на самом деле должны выглядеть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...