Проблема в проверке истечения даты и времени с использованием часового пояса - PullRequest
2 голосов
/ 01 мая 2020

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

У меня ниже пример класса

 <?php
  class JobTimer{
    public function __construct() {

    }
    public function isDateTime($startOn, $timezone = "GMT"){
        $nowTime = new \DateTime("NOW", new \DateTimeZone($timezone));    
        $startTime = \DateTime::createFromFormat('M d, Y H:i:s', $startOn, new \DateTimeZone($timezone));
        return ($nowTime >= $startTime ? true : false);
    }
}
?>

Использование Все возвращается true, я ожидаю вернуть false, если текущее время, основанное на timezone, еще не истекло или не вернулось true, когда время истекло или время now

  <?php
   $job = new JobTimer();
    //if($job->isDateTime("2019-05-02 12:00AM", "Asia/Kuala_Lumpur")){
    //if($job->isDateTime("2021-05-02 12:00AM", "Asia/Kuala_Lumpur")){
    if($job->isDateTime("2020-05-02 12:00AM", "Asia/Kuala_Lumpur")){
        echo "YES";
    }else{
        echo "NO";
    }
   ?>

Ответы [ 2 ]

2 голосов
/ 01 мая 2020

В вашем классе JobTimer $startTime имеет значение false, поскольку ваш формат для DateTime::createFromFormat() не соответствует формату даты, которую вы передаете в качестве параметра, и это приводит к сбою.

M d, Y H:i:s соответствует May 02, 2020 12:00:00 это не то, что вы передаете этому классу.

Вы должны использовать:

$startTime = \DateTime::createFromFormat('Y-m-d H:iA', $startOn, new \DateTimeZone($timezone));

Рабочий код:

class JobTimer{
    public function __construct() {

    }
    public function isDateTime($startOn, $timezone = "GMT"){
        $nowTime = new \DateTime("NOW", new \DateTimeZone($timezone));
        $startTime = \DateTime::createFromFormat('Y-m-d H:iA', $startOn, new \DateTimeZone($timezone));
        return $nowTime >= $startTime;
    }
}


$job = new JobTimer();
if($job->isDateTime("2020-05-02 12:00AM", "Asia/Kuala_Lumpur")){
    echo "YES";
}else{
    echo "NO";
}

Вывод:

NO

Демо

0 голосов
/ 01 мая 2020

Измените свою функцию следующим образом:

public function isDateTime($startOn, $timezone = "GMT"){

    $nowTime = new \DateTime("NOW", new \DateTimeZone($timezone));    
    $startTime = new \DateTime($startOn, new \DateTimeZone($timezone));
    return ($nowTime >= $startTime ? true : false);
}

Ваш аргумент, переданный createFromFormat, неверен, и поэтому неправильно создает DateTime. Вы можете просто передать свои $startOn и DateTimeZone, чтобы создать экземпляр DateTime

...