PHP比较两个日期时间范围

3

我有两个日期范围,其中一个范围的 Start_TimeEnd_Time 来自 MYSQL 数据库,另一个(用户)范围是每天从 晚上6点 到第二天的 早上5点

现在我正在尝试比较这两个范围,并确保用户输入的 -开始时间- (晚上6点 到第二天的 早上5点) 不会落在 "Start_Time" 和 "End_Time" 之间,反之亦然。

数据库中的 End_Time 和用户的 开始时间结束时间 也是如此。

代码:

  1. 创建用户日期的开始和结束时间格式,但每天的时间都是恒定的(晚上6点 到第二天的 早上5点
    用户范围(例如):
User Start Time:...... 2015-04-18 18:00:00
User End Time:2015-04-19 05:00:00

在数据库中:

MySQL DB Start Time:............ 2015-04-19 00:50:00
MySQL DB End Time:....2015-04-19 23:50:00

对于用户来说,时间范围总是从 下午6点下午5点。我们只需要修改日期即可。

为了实现用户需要的时间范围:

$sttime="18:00:00";
$ettime="05:00:00";
$teststartdate = date("Y-m-d");

$teststartdatetime=$teststartdate." ".$sttime;

#Calculate Endtime
#$testendtime=date('Y-m-d', strtotime($teststartdate . ' + 1 day'))." ".$ettime; 

为了进行对比,我编写了一个函数,但是似乎它并不总是有效:

function dateIsBetween($dbfrom1,$dbto1,$user_st,$user_et) {

    $from = strtotime($dbfrom1);
    $to = strtotime($dbto1);  
    $st = strtotime($user_st);
    $et = strtotime($user_et);
    echo "DB FROM:............ ".$from.PHP_EOL."DB TO:....".$to.PHP_EOL."ST Start Time:...... ".$st.PHP_EOL."ST End Time:".$et;
      if (('$from' >= '$st' && '$from' < '$et') || ('$to' >= '$st' && '$to' <= '$et') || ('$from' <= '$st' && '$to' > '$et')) {      
        return 1;
      }else {return 0;}

如果用户的日期(开始日期或结束日期)位于数据库范围内,我需要打印“忙碌”。

这个逻辑有时有效,有时无效。

1个回答

4
我可能过于简化了,但在我的三个测试场景中(尽管有限),都正常运作。
var_dump(dateIsBetween('2015-04-01 14:00:00', '2015-04-02 05:00:00', '2015-04-01 08:00:00', '2015-04-01 10:00:00'));
var_dump(dateIsBetween('2015-04-01 14:00:00', '2015-04-02 05:00:00', '2015-04-01 18:00:00', '2015-04-01 19:00:00'));
var_dump(dateIsBetween('2015-04-01 14:00:00', '2015-04-02 05:00:00', '2015-04-01 08:00:00', '2015-04-02 05:00:00'));

function dateIsBetween($dbfrom1,$dbto1,$user_st,$user_et) {

    if(((strtotime($user_st) >= strtotime($dbfrom1)) and (strtotime($user_st) <= strtotime($dbto1))) or (strtotime($user_et) >= strtotime($dbfrom1)) and (strtotime($user_et) <= strtotime($dbto1))) {

        return true;

    } else {

        return false;   

    }

}

编辑

我认为我在重新阅读后方法的参数反了。

请尝试这样:

var_dump(dateIsBetween('2015-04-01 08:00:00', '2015-04-01 10:00:00', '2015-04-01 14:00:00', '2015-04-02 05:00:00'));
var_dump(dateIsBetween('2015-04-01 18:00:00', '2015-04-01 19:00:00', '2015-04-01 14:00:00', '2015-04-02 05:00:00'));
var_dump(dateIsBetween('2015-04-01 08:00:00', '2015-04-02 05:00:00', '2015-04-01 14:00:00', '2015-04-02 05:00:00'));

function dateIsBetween($dbfrom1,$dbto1,$user_st,$user_et) {


    if(((strtotime($dbfrom1) >= strtotime($user_st)) and (strtotime($dbfrom1) <= strtotime($user_et))) or (strtotime($dbto1) >= strtotime($user_st)) and (strtotime($dbto1) <= strtotime($user_et))) {

        return true;

    } else {

        return false;   

    }

}

谢谢你的回答,Michael。 我已经复制粘贴了你的代码,并在strtotime之前的函数中输出了所有变量,看起来它没有起作用:dbfrom1:: 2015-04-19 22:31:00 dbto1:: 2015-04-19 23:31:00 user_st:: 2015-04-19 18:00:00 user_et::2015-04-20 05:00:00以下是我稍微修改过的代码: - newbie83
你在strtotime之前都输出了所有的变量吗?你需要使用strtotime将其转换为Unix时间戳以正确地进行比较。你是否使用我提供的测试时间范围验证了我的结果? - Michael Scola
function dateIsBetween($dbfrom1,$dbto1,$user_st,$user_et) { echo "dbfrom1:: ".$dbfrom1.PHP_EOL."dbto1:: ".$dbto1.PHP_EOL."user_st:: ".$user_st.PHP_EOL."user_et".$user_et.PHP_EOL; if(((strtotime($user_st) >= strtotime($dbfrom1)) and (strtotime($user_st) <= strtotime($dbto1))) or (strtotime($user_et) >= strtotime($dbfrom1)) and (strtotime($user_et) <= strtotime($dbto1))) { return 1; } else { return 0; } } - newbie83
感谢您的关注,但以下日期仍无法正常工作: 根据用户的日期应该打印“忙碌”: 我已经在strtotime之前回显了。我的时间组合是: dbfrom1 :: 2015-04-19 22:31:00 dbto1 :: 2015-04-19 23:31:00 user_st :: 2015-04-19 18:00:00 user_et :: 2015-04-20 05:00:00 - newbie83
看起来“编辑版本”可以运行了。我复制粘贴时出错了。 再次抱歉。 - newbie83
很高兴听到这个消息!希望你的项目顺利进行! - Michael Scola

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接