Programmer : Dhiren Patel
Platform : NT 4.0 Workstation
Compiler : VC++ 5.0
Date : April 21, 1998
Copyright : You are free to distribute this source
code provided this header is not removed and
not altered in any way without prior written permission
from the programmer.
*************************************************************************/
#include <stdio.h>
#include <conio.h>
/*************************************************************************
Function DMY
Parameters : Character Pointer to two date strings in DayMonthYear format.
Return Value : Returns an integer specifying the no of days between
two dates. If illegal dates are
entered, then a 0 is returned
Programmer : Dhiren Patel
Comment : Standard library calls are avoided so that
the function can be compiled and used in
any other languages without requiring the libraries
and also to keep the function small.
Copyright : You are free to distribute this source
code provided this header is not removed and
not altered in any way without prior written permission
from the programmer.
****************************************************************************/
int DMY(char* ststr,char* edstr)
{
int i,flag = 0;
int days = 0;
int styr,stmth,stdt;
int edyr,edmth,eddt;
for(i=0; ststr[i] != '\0'; i++);
if(i != 8)
return 0;
for(i=0; edstr[i] != '\0'; i++);
if(i != 8)
return 0;
/*extracting dates from string */
styr = (ststr[4]-'0')*1000 + (ststr[5]-'0')*100 + (ststr[6]-'0')*10
+ (ststr[7]-'0');
stmth = (ststr[2]-'0')*10 + (ststr[3]-'0');
stdt = (ststr[0]-'0')*10 + (ststr[1]-'0');
edyr = (edstr[4]-'0')*1000 + (edstr[5]-'0')*100 + (edstr[6]-'0')*10
+ (edstr[7]-'0');
edmth = (edstr[2]-'0')*10 + (edstr[3]-'0');
eddt = (edstr[0]-'0')*10 + (edstr[1]-'0');
/*if same dates */
if (styr == edyr)
{
if( stmth == edmth)
{
if( stdt == eddt)
{
return 0;
}
else if(stdt > eddt)
{
i = stdt; stdt = eddt; eddt = i; flag = 1;
}
}
else if( stmth > edmth)
{
i = stmth; stmth = edmth; edmth = i; flag = 1;
i = stdt; stdt = eddt; eddt = i;
}
}
/*reverse the dates */
if (styr > edyr)
{
i = styr; styr = edyr; edyr = i; flag = 1;
i = stmth; stmth = edmth; edmth = i;
i = stdt; stdt = eddt; eddt = i;
}
/*checking for wromg date and year */
if( stmth > 12 || stmth < 1 || edmth > 12 || edmth <1 ||
stdt > 31 || stdt < 1 || eddt > 31 || eddt < 1)
return 0;
/*checking for wrong date in feb styr */
if( stmth == 2 )
if (stdt > 28)
if((styr % 4)!=0)
return 0;
else if(stdt != 29)
return 0;
/*checking for wrong date in feb edyr */
if( edmth == 2 )
if (eddt > 28)
if((edyr % 4)!=0)
return 0;
else if(eddt != 29)
return 0;
/*if same edyr & styr */
if(styr == edyr)
{
if(stmth == edmth)
{
days = days + (eddt - stdt);
if(flag) return -days; else return days;
}
else
{
switch(stmth) /* adding for stmth */
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = days + (31-stdt); break;
case 4:
case 6:
case 9:
case 11:
days =days + (30-stdt); break;
case 2:
if((styr % 4) == 0)
{
days = days + (29- stdt);
break;
}
else
{
days = days + (28-stdt);
break;
}
}
days = days + eddt; /* adding for edmth */
/* adding for months in between */
if((edmth - stmth) > 1)
{
for(i = stmth + 1; i < edmth; i++)
{
switch(i)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = days + 31; break;
case 4:
case 6:
case 9:
case 11:
days =days + 30; break;
case 2:
if((styr % 4) == 0)
{
days = days + 29;
break;
}
else
{
days = days + 28;
break;
}
}
}
}
}
if(flag) return -days; else return days;
}
/*adding for in between years */
if((edyr - styr) > 1)
for( i = styr+1; i <= edyr-1; i++)
if ((i % 4) == 0)
days = days + 366;
else
days = days + 365;
/*adding for months of start year */
for( i = stmth+1; i < 13; i++)
{
switch(i)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = days + 31; break;
case 4:
case 6:
case 9:
case 11:
days =days + 30; break;
case 2:
if((styr % 4) == 0)
{
days = days + 29;
break;
}
else
{
days = days + 28;
break;
}
}
}
/*adding for months of end year */
for( i = 1; i < edmth; i++)
{
switch(i)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = days + 31; break;
case 4:
case 6:
case 9:
case 11:
days = days + 30; break;
case 2:
if((edyr % 4) == 0)
{
days = days + 29;
break;
}
else
{
days = days + 28;
break;
}
}
}
/*adding for stmth */
switch(stmth)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = days + (31 - stdt); break;
case 4:
case 6:
case 9:
case 11:
days = days + (30 - stdt); break;
case 2:
if((styr % 4) == 0)
{
days = days + (29 - stdt);
break;
}
else
{
days = days + (28 - stdt);
break;
}
}
/*adding for edmth */
days = days + eddt;
if(flag) return -days; else return days;
}
/* End of DMY function Delete the code that follows below when
compiling
for the routine. With the below code it is a stand alone program for
DMY */
void main()
{
char stdate[9];
char eddate[9];
printf("\nEnter start date : ");
scanf("%s",stdate);
printf("\nEnter end date : ");
scanf("%s",eddate);
printf("\n\nDays = %d\n",DMY(stdate,eddate));
_getch();
}