newbie83
newbie83

Reputation: 53

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 p.m to 5 a.m

Now I am trying to compare two ranges and make sure user enters -start time- (6p.m to 5 a.m next day) does not fall in "Start_Time" and "End_Time" and vice versa.

Same is also true with database End_Time and user's start time and end time.

Code:

  1. Create a format of start and end time of user date but everyday time is constant (6 p.m to next day 5 a.m)
    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. 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.

Upvotes: 3

Views: 3299

Answers (1)

Michael Scola
Michael Scola

Reputation: 84

I may have oversimplified this, but in my 3 test scenarios, as limited as they might be, are working.

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;   

    }

}

Upvotes: 4

Related Questions