如何确定给定的开始和结束时间是否已在php中过期

时间:2018-03-25 22:31:28

标签: php mysql datetime

我想创建一个php代码,根据用户指定的开始日期和结束时间检查时间是否已过期或仍然有效。 下面是我试过的数据库结构和示例php代码。

game_config

game_id | start_date | start_t | start_h | end_time | end_h | status  
--------|------------|---------|---------|----------|-------|---------
100     | 03/26/2018 |  10:45  | PM      |   12:30  |  AM   | 0 
101     | 03/27/2018 |  09:23  | AM      |   11:10  |  AM   | 0 

Php代码示例

<?php
    $conf_execution_date = date('m/d/Y'); /*Current date*/
    $conf_execution_meridiem = date('A'); /*Current meridiem*/
    $conf_execution_timer = date('h:m'); /*Current time*/
    $conf_execution_proccess = false;    /*Proceed or not*/

    $conf_handler = $appconn->prepare("
        SELECT * FROM game_config WHERE game_id = :game_id AND start_date = :start_dateAND start_t = :start_t AND status = 0 LIMIT 1
    ");

    $conf_handler->bindParam(":game_id", 100);
    $conf_handler->bindParam(":start_date", $conf_execution_date);
    $conf_handler->bindParam(":start_t", $conf_execution_meridiem); 
    $conf_handler->execute();
    $appconf = $conf_handler->fetch(PDO::FETCH_OBJ);

    if($appconf){
        $config_start_time = strtotime($appconf->start_t);
        $config_end_time = strtotime($appconf->end_time);
        $current_time = strtotime($conf_execution_timer);

        if($appconf->start_h == $conf_execution_meridiem){ /*AM-PM*/
            if($config_start_time >= $current_time){ /*Check if the start time is now o still active*/
                $conf_execution_proccess = true;
            }
        }

        if($appconf->end_h == $conf_execution_meridiem){ /*AM-PM*/
            if($config_end_time >= $current_time){ /*Check if the time has ended*/
                $conf_execution_proccess = false;
            }
        }

        if($conf_execution_proccess == true){
            echo 'YES THE GAME IS STILL ACTIVE';
        }else{
            echo "NO GAME HAS ENDED";
        }
    }
?>

1 个答案:

答案 0 :(得分:0)

假设您的start_date列的类型为VARCHAR()

假设您的end_time总是晚于start_time

您可以使用此类查询来获取表格每行的起始和结束DATETIME值。它将日期,时间和AM / PM字段粘合在一起,并将它们转换为DATETIME。 (http://sqlfiddle.com/#!9/2d84ea/1/0

SELECT game_id, 
       STR_TO_DATE(CONCAT(start_date,'-',start_t,start_h), '%m/%d/%Y-%h:%i%p') start_ts,
       STR_TO_DATE(CONCAT(start_date,'-',end_time,end_h), '%m/%d/%Y-%h:%i%p') end_ts,
       status    
  FROM game_config

然后,您可以将这些start_tsend_ts值与NOW()进行比较,方法是将此行添加到您的查询中

然后,您可以使用所需的条件填写查询,并提供此查询。

SELECT game_id, 
       STR_TO_DATE(CONCAT(start_date,'-',start_t,start_h), '%m/%d/%Y-%h:%i%p') start_ts,
       STR_TO_DATE(CONCAT(start_date,'-',end_time,end_h), '%m/%d/%Y-%h:%i%p') end_ts,
       status    
  FROM game_config
 WHERE game_id = : gameid AND status = 0
HAVING start_ts <= NOW() and NOW() < end_ts
 LIMIT 1

但是,你的开始和结束时间有时会跨越午夜,这意味着你的end_ts需要在第二天。这使得你的日期检查逻辑相当棘手。您必须执行某种条件表达式,如果+ INTERVAL 1 DAY位于end_ts之前,则start_ts game_id int start_ts timestamp of start end_ts timestamp of end status int

如果你在表格中添加以下列,你会好起来的(@eggyal在他的评论中指出了这一点)。

handleUniversalLink

然后,您不必担心从三个不同列中制作正确时间戳的所有内容,并且当开始和结束时间跨越午夜时,您不必做任何特别的事情。

而且,无论您的用户处于什么时区,这都将直观地发挥作用。