日历引擎

// 欲知日期星期几 = 参考日期 星期几 + (相隔天数 % 7)
//
// 判断日期是否有效
//
// 比较两个日期大小
//
// 算出相隔天数
//
// 算出星期几

#include 
< stdio.h >

// 判断是否是有效的日期
int  AssertAvailabilityDate( long  lYear, long  lMon, long  lDay)
{
if0>=lMon || 12<lMon )
   
return 0;
if0>=lDay || 31<lDay )
   
return 0;
if(2==lMon)
{
   
//年份能直接被4整除但不能被100整除的或者能直接被400整除的就是闰年,反之为平年.
   int iIsLeapYear=0;
   
if( (lYear%4==0 && lYear%100!=0|| (lYear%400==0) )
   
{
   iIsLeapYear
=1;
   }

   
if(iIsLeapYear)
   
{
   
if(29<lDay)
   
{
     
return 0;
   }

   }

   
else
   
{
   
if(28<lDay)
   
{
     
return 0;
   }

   }

}

else
{
   
if4==lMon || 6==lMon || 9==lMon || 11==lMon )
   
{
   
if(30<lDay)
   
{
     
return 0;
   }

   }

}

return 1;
}

// 比较两个日期大小
// 1>2 返回 1
// 1==2 返回 0
// 1<2 返回 -1
int  CompareTwoDate( long  lYear1, long  lMon1, long  lDay1, long  lYear2, long  lMon2, long  lDay2)
{
if(lYear1>lYear2)
{
   
return 1;
}

else if(lYear1==lYear2)
{
   
if(lMon1>lMon2)
   
{
   
return 1;
   }

   
else if(lMon1==lMon2)
   
{
   
if(lDay1>lDay2)
   
{
     
return 1;
   }

   
else if(lDay1==lDay2)
   
{
     
return 0;
   }

   
else
   
{
     
return -1;
   }

   }

   
else
   
{
   
return -1;
   }

}

else //if(lYear1<lYear2)
{
   
return -1;
}

}

// 算出相隔多少天
long  GetDiscrepancyDays( long  lYear1, long  lMon1, long  lDay1, long  lYear2, long  lMon2, long  lDay2)
{
//2006-12-31  
long lDiscrepancy = 0 ;
if(0<CompareTwoDate(lYear1,lMon1,lDay1,lYear2,lMon2,lDay2))
{
   
while(CompareTwoDate(lYear1,lMon1,lDay1,lYear2,lMon2,lDay2))
   
{
   lDiscrepancy
++;
   lDay2
++;
   
if(lMon2==1 ||lMon2==3 ||lMon2==5 ||lMon2==7 ||lMon2==8 ||lMon2==10 ||lMon2==12)
   

     
if(lDay2>31)
     
{
     lDay2
=1;
     lMon2
++;

     
if(lMon2>12)
     
{
       lMon2
=1;
       lYear2
++;
     }

     }

   }

   
else if(lMon2==2)
   
{
     
if((lYear2%4==0 && lYear2%100!=0||(lYear2%400==0))
     
{
     
if(lDay2>29)
     
{
       lDay2
=1;
       lMon2
++;
  
       
if(lMon2>12)
       
{
       lMon2
=1;
       lYear2
++;
       }

     }

     }

     
else
     
{
     
if(lDay2>28)
     
{
       lDay2
=1;
       lMon2
++;
  
       
if(lMon2>12)
       
{
       lMon2
=1;
       lYear2
++;
       }

     }

     
     }

   }

   
else
   
{
     
if(lDay2>30)
     
{
     lDay2
=1;
     lMon2
++;

     
if(lMon2>12)
     
{
       lMon2
=1;
       lYear2
++;
     }

     }

   }

   }

}

else if(0>CompareTwoDate(lYear1,lMon1,lDay1,lYear2,lMon2,lDay2))
{
   
while(CompareTwoDate(lYear1,lMon1,lDay1,lYear2,lMon2,lDay2))
   
{
   lDiscrepancy
++;
   lDay1
++;
   
if(lMon1==1 ||lMon1==3 ||lMon1==5 ||lMon1==7 ||lMon1==8 ||lMon1==10 ||lMon1==12)
   

     
if(lDay1>31)
     
{
     lDay1
=1;
     lMon1
++;

     
if(lMon1>12)
     
{
       lMon1
=1;
       lYear1
++;
     }

     }

   }

   
else if(lMon1==2)
   
{
     
if((lYear1%4==0 && lYear1%100!=0||(lYear1%400==0))
     
{
     
if(lDay1>29)
     
{
       lDay1
=1;
       lMon1
++;
  
       
if(lMon1>12)
       
{
       lMon1
=1;
       lYear1
++;
       }

     }

     }

     
else
     
{
     
if(lDay1>28)
     
{
       lDay1
=1;
       lMon1
++;
  
       
if(lMon1>12)
       
{
       lMon1
=1;
       lYear1
++;
       }

     }

     
     }

   }

   
else
   
{
     
if(lDay1>30)
     
{
     lDay1
=1;
     lMon1
++;

     
if(lMon1>12)
     
{
       lMon1
=1;
       lYear1
++;
     }

     }

   }

   }

}

else
{
   lDiscrepancy 
= 0 ;
}

return lDiscrepancy ;
}


// 导出函数 
// 算出星期几
// 参考日期
// 2007.1.1 => 1
// 2007.1.7 => 7
int  GetWeek( long  lYear, long  lMon, long  lDay)
{
if(!AssertAvailabilityDate(lYear,lMon,lDay))
{
   
//输入的日期无效 返回 -1
   return -1;
}

long lDiscrepancy = 0 ;
if(0==CompareTwoDate(2007,1,1,lYear,lMon,lDay))
{
   
return 1;
}

else if(0<CompareTwoDate(2007,1,1,lYear,lMon,lDay))
{
   lDiscrepancy
=GetDiscrepancyDays(2007,1,7,lYear,lMon,lDay);
   
return 7-(lDiscrepancy%7);
}

else
{
   lDiscrepancy
=GetDiscrepancyDays(2007,1,1,lYear,lMon,lDay);
   
return 1+(lDiscrepancy%7);
}

}


// 给我一个日期,我告诉你它的坐标. 7*6
// 2007-1
//    一 二 三 四 五 六 日
// 1 1   2   3   4   5   6   7
// 2 8   9   10 11 12 13 14
// 3 15 16 17 18 19 20 21
// 4 22 23 24 25 26 27 28
// 5 29 30 31
// 6
// 判断是否是有效的日期
// 算出 lYear年1月1日 是星期几
// 算出 lYear年1月1日 的坐标
// 导出函数 
// 算出 lYear年lMon月lDay日 是星期几
// 算出 lYear年lMon月lDay日 的坐标
int  GetCoordinate( long  lYear, long  lMon, long  lDay, int   * pReturnX, int   * pReturnY)
{
*pReturnX=0;
*pReturnY=0;
if(!AssertAvailabilityDate(lYear,lMon,lDay))
{
   
return 0;
}

int iFristWeek=GetWeek(lYear,lMon,1);
if(1==lDay)
{
   
*pReturnX=iFristWeek;
   
*pReturnY=1;
   
return 1;
}

int iCurWeek=GetWeek(lYear,lMon,lDay);
*pReturnX=iCurWeek;
long lDiscrepancy=GetDiscrepancyDays(lYear,lMon,lDay,lYear,lMon,1);
*pReturnY=1;

while(lDiscrepancy--)
{
   iFristWeek
++;
   
if(iFristWeek>7)
   
{
   iFristWeek
=1;
   (
*pReturnY)++;
   }

}

return 1;
}


int  main()
{
int a,b,c,w,x,y;
scanf(
"%d%d%d",&a,&b,&c);
w
=GetWeek(a,b,c);
GetCoordinate(a,b,c,
&x,&y);
printf(
" %d-%d-%d => %d ",a,b,c,w);
printf(
" %d-%d-%d => (%d,%d) ",a,b,c,x,y);
return 0;
}
 

你可能感兴趣的:(日历引擎)