possible bug ... end of month rollover in Time library

Started by CommonTater, February 28, 2011, 04:48:03 PM

Previous topic - Next topic

CommonTater

There appears to be a problem with the mktime() and difftime() functions when the time rolls over the end of a month...  

Here's the code that exhibits the problem...
// CITY PARKING
#include <stdio.h>
#include <time.h>
// monetary values
#define PRICE_CAR    1.25      // car rate per hour
#define PRICE_TRUCK  2.50      // truck rate per hour
#define GATE_CHARGE  5.00      // flat rate for entry
#define GATE_TIME    30        // flat rate period
#define SALES_TAX    17.5      // tax addon in percent

int _cdecl main( void )
 { int tOnLot = 0;
   float Rate = PRICE_CAR;
   printf("\n\t\t *****  CITY PARKING *****\n\n");
   // get time in and time out
   { struct tm tIn = {0}, tOut = {0};
     printf("Enter times as\tYYYY MM DD HH MM\n");
     printf("Time In   :\t");
     scanf("%d %d %d %d %d",&tIn.tm_year,&tIn.tm_mon,&tIn.tm_mday,
                             &tIn.tm_hour,&tIn.tm_min);
     printf("Time Out  :\t");
     scanf("%d %d %d %d %d",&tOut.tm_year,&tOut.tm_mon,&tOut.tm_mday,
                             &tOut.tm_hour,&tOut.tm_min);
      tOnLot = difftime(mktime(&tOut),mktime(&tIn)) / 60; }  // time in minutes  
   // get vehicle type and set hourly rate
   { getchar();
     printf("\nIs this a Truck? (Y or N) : ");
     int vt = getchar();
     if ( vt == 'y' || vt == 'Y')
       Rate = PRICE_TRUCK; }  
   // display time
   printf("\nTime on Lot : %d minutes\n\n",tOnLot);    
   // calculate billable time
   { float Total = 0;
     float Time = 0;
     float Tax = 0;
     tOnLot -= GATE_TIME;
     printf("Gate Fee  :\t%8.2f\n",GATE_CHARGE);
     if( tOnLot > 0)
       { Time = (tOnLot * Rate) / 60.0;
         printf("Time      :\t%8.2f   (%dmin @ $%.2fhr) \n",Time,tOnLot,Rate); }
     Total = GATE_CHARGE + Time;
     printf("SubTotal  :\t%8.2f\n", Total);
     Tax = Total * (SALES_TAX / 100.0);
     printf("Sales Tax :\t%8.2f\n\n",Tax);
     Total += Tax;
     printf("Total Due :\t%8.2f\n\n",Total); }  
   return 0; }


I'm attaching an image that shows the problem... note that in all cases the "time on lot" should be 10 minutes.

CommonTater

This can be withdrawn... 

I didn't realize until i tried it with something else that the months run 0 -11 where most people would enter 1 - 12. 

No bug... just one of C's many "gotcha" bits.