?
Solved

Problem with comparing dates

Posted on 2006-05-07
11
Medium Priority
?
231 Views
Last Modified: 2008-02-26
Hello everyone,

I have problem when I am comparing dates.More specific I want to find in which period somebody would like to rent a car.If the date that the user select is between 01/04/2006 and 15/06/2006 it means that it is in the first period and will assign in the variable $pickupperiod=1;. The problem is that it doesn't compare them.Actually it goes through all the if statements instread of taking only the correct period.


The following code is a part of what I am using:
PHP Code:
    $period[1][1]="01/04/2006";
    $period[1][2]="15/06/2006";
    $period[2][1]="16/06/2006";
    $period[2][2]="15/07/2006";
    $period[3][1]="16/07/2006";
    $period[3][2]="31/08/2006";
    $period[4][1]="01/09/2006";
    $period[4][2]="30/09/2006";
    $period[5][1]="01/10/2006";
    $period[5][2]="31/10/2006";

$pickupdate= $_POST["pickupdate"];


if (($period[1][1] < $pickupdate) && ($pickupdate < $period[1][2]))

        {
            $pickupperiod=1;
           
        }

if (($period[2][1] < $pickupdate) && ($pickupdate < $period[2][2]))
        {
            $pickupperiod=2;
        }

if (($period[3][1] < $pickupdate) && ($pickupdate < $period[3][2]))
            {
                  $pickupperiod=3;
            }
if (($period[4][1] < $pickupdate) && ($pickupdate < $period[4][2]))
            {
                  $pickupperiod=4;
            }
            
if (($period[5][1] < $pickupdate) && ($pickupdate < $period[5][2]))
            {
                  $pickupperiod=5;
            }

if (($period[1][1] < $dropoffdate) && ($dropoffdate < $period[1][2]))
            {
                  $dropoffperiod=1;
            }

if (($period[2][1] < $dropoffdate) && ($dropoffdate < $period[2][2]))
            {
                  $dropoffperiod=2;
            }

if (($period[3][1] < $dropoffdate) && ($dropoffdate < $period[3][2]))
            {
                  $dropoffperiod=3;
            }

if (($period[4][1] < $dropoffdate) && ($dropoffdate < $period[4][2]))
            {
                  $dropoffperiod=4;
                  
            }

if (($period[5][1] < $dropoffdate) && ($dropoffdate < $period[5][2]))
            {
                  $dropoffperiod=5;
                  
            }

if ($pickupperiod-$dropoffperiod==0) {

$days[$pickupperiod]= datediff(d, $dropoffdate, $pickupdate, $dropoffhour, $pickuphour );
            
            echo "days[$pickupperiod]= ". $days[$pickupperiod];
            echo "dropoffdate:  ". $dropoffdate;
      }

if ($dropoffperiod-$pickupperiod==1) {


$days[$pickupperiod]= datediff(d,$period[$pickupperiod][2], $pickupdate, $period_time,$pickuphour);
$days[$dropoffperiod]=datediff(d,$dropoffdate, $period[$dropoffdate][1], $dropoffhour,$period_time);
            echo " \n". $days[$pickupperiod];
            echo "\n ". $days[$dropoffperiod];
      }

if ($dropoffperiod-$pickupperiod==2) {

            $days[$pickupperiod]= ($period[$pickupperiod][2] - $pickupdate);
            $days[$dropoffperiod]= ($dropoffdate-$period[$dropoffdate][1]);
            $days[$pickupdate+1]= ($period[$pickupdate+1][2] - $period[$pickupdate+1][1]);
            
            echo "days[$pickupperiod]= ". $days[$pickupperiod];
            echo "days[$dropoffperiod]= ". $days[$dropoffperiod];
            
      }
      

$a[0]=$days[1]+$days[5];
$b[0]=$days[2]+$days[4];
$c[0]=$days[3];


Could you please help me is there is any specific function in php that is doing the comparison or any other idea?

Thank you in advance,
Xenia
0
Comment
Question by:xenoula
11 Comments
 
LVL 29

Expert Comment

by:TeRReF
ID: 16625495
You are comparing strings instead of dates.
You should convert the dates to unix_timestamps (which are integers) and use those for your if statements...
Have a look at:
http://php.net/manual/en/function.mktime.php

If you need an example, let me know...

0
 

Author Comment

by:xenoula
ID: 16625908
Can I use the function mktime to take only dd mm and yyyy and not the second,minutes and hours?

Can you please provide an example regarding my code?

Thank you very much,
Xenia
0
 
LVL 29

Accepted Solution

by:
TeRReF earned 2000 total points
ID: 16626161
Sure you can...
Okay, here we go:

<?php
    $period[1][1]="01/04/2006";
    $period[1][2]="15/06/2006";
    $period[2][1]="16/06/2006";
    $period[2][2]="15/07/2006";
    $period[3][1]="16/07/2006";
    $period[3][2]="31/08/2006";
    $period[4][1]="01/09/2006";
    $period[4][2]="30/09/2006";
    $period[5][1]="01/10/2006";
    $period[5][2]="31/10/2006";

    // I'm assuming $pickupdate has the same format
    $pickupdate= "17/08/2006";
    $pd = explode('/', $pickupdate);
    $newpickupdate = mktime(0, 0, 0, $pd[1], $pd[0], $pd[2]);
    $i = 1;
    foreach ($period as $p) {
        $bd = explode('/', $p[1]);
        $ed = explode('/', $p[2]);
        $newperiod[$i][1] = mktime(0, 0, 0, $bd[1], $bd[0], $bd[2]);
        $newperiod[$i][2] = mktime(0, 0, 0, $ed[1], $ed[0], $ed[2]);
        $i++;
    }

    if (($newnewperiod[1][1] < $newpickupdate) && ($newpickupdate < $newperiod[1][2])) {
        $pickupperiod=1;
    }
    if (($newperiod[2][1] < $newpickupdate) && ($newpickupdate < $newperiod[2][2])) {
        $pickupperiod=2;
    }
    if (($newperiod[3][1] < $newpickupdate) && ($newpickupdate < $newperiod[3][2])) {
        $pickupperiod=3;
    }
    if (($newperiod[4][1] < $newpickupdate) && ($newpickupdate < $newperiod[4][2])) {
        $pickupperiod=4;
    }
    if (($newperiod[5][1] < $newpickupdate) && ($newpickupdate < $newperiod[5][2])) {
        $pickupperiod=5;
    }
    print($pickupperiod);
?>
0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 7

Expert Comment

by:CraigHarris
ID: 16626187
You can use mktime and give 0's for the seconds minutes and hours. www.php.net/mktime
Or just use StrToTime() www.php.net/strtotime

e.g.
  $period[1][1]="01/04/2006";
//...

$pickupdate= $_POST["pickupdate"];

if ((StrToTime($period[1][1]) < StrToTime($pickupdate)) && (StrToTime($pickupdate) < StrToTime($period[1][2])))  {
     $pickupperiod=1;
}


... it's more efficient to do the conversions once ....

  $period[1][1]= StrToTime("01/04/2006");
    $period[1][2]= StrToTime("15/06/2006");
//...

$pickupdate= StrToTime($_POST["pickupdate"]);

// leave remainder of code unchanged...

.... or, using mktime ....

  $period[1][1]= MkTime(0, 0, 0, 4, 1, 2006);
  $period[1][2]= MkTime(0, 0, 0, 6, 15, 2006);


For your date calcultions towards end of script - other split up all your times using GetDate() www.php.net/getdate -- or use StrToTime which can take +'s & -'s, such as "$date + 1 day" -- or you may like to use a combination

This gives you several options, all of which should work fine.
0
 
LVL 9

Expert Comment

by:Naveen Swamy
ID: 16628217
0
 

Author Comment

by:xenoula
ID: 16628920
I used TeRReF code and also I modify  some parts of the code and now is partly working. What I mean with partly is that when I tryied to run
the page and select from the form as pick up date 10/05/2006 and drop off date 12/05/2006(low period)it gave me the correct results as it entered in the correct if statement(the first one).However when I tryied to put dates from the high season ex.pick up date  05/08/2006 and drop off date 08/08/2006 I had problem. It didn't enter to the correct if statement and didn't print the correct period $pickuperiod and %dropoffperiod variables.

Could you please have a look If you can see any error to my code?

      $period[1][1]=mktime(0,0,0,04,01,2006);
      $period[1][2]=mktime(0,0,0,06,15,2006);
      $period[2][1]=mktime(0,0,0,06,16,2006);
      $period[2][2]=mktime(0,0,0,07,15,2006);
      $period[3][1]=mktime(0,0,0,07,16,2006);
      $period[3][2]=mktime(0,0,0,08,31,2006);
      $period[4][1]=mktime(0,0,0,09,01,2006);
      $period[4][2]=mktime(0,0,0,09,30,2006);
      $period[5][1]=mktime(0,0,0,10,01,2006);
      $period[5][2]=mktime(0,0,0,10,31,2006);

$pickupperiod=0;
$dropoffperiod=0;

$days[1]=0;
$days[2]=0;
$days[3]=0;
$days[4]=0;
$days[5]=0;

$a[0]=0;
$b[0]=0;
$c[0]=0;

      $pickupdate= $_POST["pickupdate"];
      echo "\n pick up user: " .$pickupdate;
    $pd = explode('/', $pickupdate);
      $pickuphour= $_POST["pickuphours"];
    $ph = explode(':', $pickuphour);
      $newpickupdate = mktime($ph[0], $ph[1], 0, $pd[1], $pd[0], $pd[2]);
      
      $dropoffdate= $_POST["dropoffdate"];
      echo "\n drop off user: " .$dropoffdate;
    $dd = explode('/', $dropoffdate);
      $dropoffhour= $_POST["dropoffhours"];
    $dh = explode(':', $dropoffhour);
    $newdropoffdate = mktime($dh[0], $dh[1], 0, $dd[1], $dd[0], $dd[2]);

if (($period[1][1] < $newpickupdate) && ($newpickupdate < $period[1][2]))
            {
                  $pickupperiod=1;
                  echo "mpike period 1 \n";

            }

if (($period[2][1] < $newpickupdate) && ($newpickupdate < $period[2][2]))
            {
                  $pickupperiod=2;
                  echo "mpike period 2";
            }      

if (($period[3][1] < $newpickupdate) && ($newpickupdate < $period[3][2]))
            {
                  $pickupperiod=3;
                  echo "mpike period 3";
            }      
            
if (($period[4][1] < $newpickupdate) && ($newpickupdate < $period[4][2]))
            {
                  $pickupperiod=4;
                  echo "mpike period 4";

            }
            
if (($period[5][1] < $newpickupdate) && ($newpickupdate < $period[5][2]))
            {
                  $pickupperiod=5;
                  echo "mpike period 5";
            }

if (($period[1][1] < $newdropoffdate) && ($newdropoffdate < $period[1][2]))
            {
                  $dropoffperiod=1;
                  echo "mpike drop off period 1";
            }

if (($period[2][1] < $newdropoffdate) && ($newdropoffdate < $period[2][2]))
            {
                  $dropoffperiod=2;
                  echo "mpike drop off period 2";
            }

if (($period[3][1] < $newdropoffdate) && ($newdropoffdate < $period[3][2]))
            {
                  $dropoffperiod=3;
                  echo "mpike drop off period 3";
            }

if (($period[4][1] < $newdropoffdate) && ($newdropoffdate < $period[4][2]))
            {
                  $dropoffperiod=4;
                  echo "mpike drop off period 4";
            }

if (($period[5][1] < $newdropoffdate) && ($newdropoffdate < $period[5][2]))
            {
                  $dropoffperiod=5;
                  echo "mpike drop off period 5";
            }

if ($pickupperiod-$dropoffperiod==0) {


$days[$pickupperiod]=(   ($newdropoffdate-$newpickupdate)/3600  )/24;

      }

if ($dropoffperiod-$pickupperiod==1) {

$days[$pickupperiod]=( ($period[$pickupperiod][2] - $newpickupdate)/3600 ) /24;
$days[$dropoffperiod]=( ($newdropoffdate-$period[$newdropoffdate][1])/3600 ) /24;

      }

if ($dropoffperiod-$pickupperiod==2) {

            $days[$pickupperiod]=( ($period[$pickupperiod][2] - $newpickupdate)/3600 )/24;
            $days[$dropoffperiod]=( ($newdropoffdate-$period[$newdropoffdate][1])/3600 )/24;
            $days[$pickupdate+1]=( ($period[$newpickupdate+1][2] - $period[$newpickupdate+1][1])/3600 )/24;
            
            
      }
      


$a[0]=$days[1]+$days[5];
$b[0]=$days[2]+$days[4];
$c[0]=$days[3];

echo "a: " . $a[0];
echo "\n b: ". $b[0];
echo "\n c: ". $c[0];
echo "\n pickupperiod: " . $pickupperiod;
echo "\n dropoffperiod: ". $dropoffperiod;

Thank you in advance,
Xenia
0
 
LVL 29

Expert Comment

by:TeRReF
ID: 16629105
Change this:
     $period[1][1]=mktime(0,0,0,04,01,2006);
     $period[1][2]=mktime(0,0,0,06,15,2006);
     $period[2][1]=mktime(0,0,0,06,16,2006);
     $period[2][2]=mktime(0,0,0,07,15,2006);
     $period[3][1]=mktime(0,0,0,07,16,2006);
     $period[3][2]=mktime(0,0,0,08,31,2006);
     $period[4][1]=mktime(0,0,0,09,01,2006);
     $period[4][2]=mktime(0,0,0,09,30,2006);
     $period[5][1]=mktime(0,0,0,10,01,2006);
     $period[5][2]=mktime(0,0,0,10,31,2006);

To this:
     $period[1][1]=mktime(0,0,0,4,1,2006);
     $period[1][2]=mktime(0,0,0,6,15,2006);
     $period[2][1]=mktime(0,0,0,6,16,2006);
     $period[2][2]=mktime(0,0,0,7,15,2006);
     $period[3][1]=mktime(0,0,0,7,16,2006);
     $period[3][2]=mktime(0,0,0,8,31,2006);
     $period[4][1]=mktime(0,0,0,9,1,2006);
     $period[4][2]=mktime(0,0,0,9,30,2006);
     $period[5][1]=mktime(0,0,0,10,1,2006);
     $period[5][2]=mktime(0,0,0,10,31,2006);
0
 

Author Comment

by:xenoula
ID: 16629387
TeRReF  thank you very much you were right , now it is working.
General the format  for the mktime is without extra 0's?

So the format is ex. $period[1][1]=mktime(0,0,0,4,1,2006);

Thank you,
Xenia
0
 
LVL 29

Expert Comment

by:TeRReF
ID: 16629396
Yep, that's right.
0
 

Author Comment

by:xenoula
ID: 16629437
Thank again
0
 

Author Comment

by:xenoula
ID: 16635690
Sorry but I would like to ask you something else regarding the mktime.
When I tryied dates that are at the end of the high seasson it gave me again error.

I suppose that the error must be in the function that the user select the pick up and drop off date
as the format takes 00's.

How I can remove any 0's from the function

     $pickupdate= $_POST["pickupdate"];
     echo "\n pick up user: " .$pickupdate;
    $pd = explode('/', $pickupdate);
     $pickuphour= $_POST["pickuphours"];
    $ph = explode(':', $pickuphour);
     $newpickupdate = mktime($ph[0], $ph[1], 0, $pd[1], $pd[0], $pd[2]);
     
     $dropoffdate= $_POST["dropoffdate"];
     echo "\n drop off user: " .$dropoffdate;
    $dd = explode('/', $dropoffdate);
     $dropoffhour= $_POST["dropoffhours"];
    $dh = explode(':', $dropoffhour);
    $newdropoffdate = mktime($dh[0], $dh[1], 0, $dd[1], $dd[0], $dd[2]);

Thank you,
Xenia
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article discusses four methods for overlaying images in a container on a web page
It’s a season to be thankful, and we’re thankful for users like you who engage on site, solve technology problems, and network with others in the industry. What tech are we most thankful for? Keep reading.
Learn how to match and substitute tagged data using PHP regular expressions. Demonstrated on Windows 7, but also applies to other operating systems. Demonstrated technique applies to PHP (all versions) and Firefox, but very similar techniques will w…
The viewer will learn how to count occurrences of each item in an array.
Suggested Courses
Course of the Month15 days, 6 hours left to enroll

839 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question