简体   繁体   English

PHP比较两个日期时间范围

[英]PHP comparing two Date Time ranges

I have two date ranges one of the ranges Start_Time and End_Time is coming from MYSQL database and other (user) range is on every day from 6 pm to 5 am 我有两个日期范围,其中范围Start_TimeEnd_Time来自MYSQL数据库,而其他(用户)范围则是每天6 pm5 am

Now I am trying to compare two ranges and make sure user enters -start time- ( 6p.m to 5 am next day) does not fall in " Start_Time " and " End_Time " and vice versa. 现在,我尝试比较两个范围,并确保用户输入的-开始时间-( 6p.m至第二天凌晨5 am )不属于“ Start_Time ”和“ End_Time ”,反之亦然。

Same is also true with database End_Time and user's start time and end time . 数据库End_Time以及用户的开始时间结束时间也是如此。

Code: 码:

  1. Create a format of start and end time of user date but everyday time is constant ( 6 pm to next day 5 am ) 创建用户日期的开始和结束时间的格式,但是每天的时间都是固定的( 6 pm至次日凌晨5 am
    User Range (for example): 用户范围(例如):
User Start Time:...... 2015-04-18 18:00:00
User End Time:2015-04-19 05:00:00

Within the database: 在数据库内:

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

For user dates time range is always between 6p.m to 5p.m . 对于用户日期,时间范围始终在6p.m5p.m Only we have to modify the date. 只有我们必须修改日期。

To achieve user required range: 要达到用户要求的范围:

$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; 

For comparison, I wrote a function but looks like this is not always working: 为了进行比较,我编写了一个函数,但看起来并非总是如此:

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

If the user date (start date or end date) falls within database range, I need to print "Busy". 如果用户日期(开始日期或结束日期)在数据库范围内,则需要打印“忙”。
This logic works sometime, sometime it does not work. 此逻辑有时会起作用,有时会不起作用。

I may have oversimplified this, but in my 3 test scenarios, as limited as they might be, are working. 我可能对此进行了简化,但是在我的3个测试方案中(尽管可能有限),它们仍在工作。

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;   

    }

}

EDIT 编辑

I believe I had the params of the method backwards after re-reading. 我相信在重新阅读后,我对方法有一些反感。

Try this: 尝试这个:

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;   

    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM