65,211
社区成员
发帖
与我相关
我的任务
分享
#include <string>
#include <iostream>
//g++ -otest.exe *.cpp
//return: bool
//true:it is a leap year
//false:not a leap year
bool isLeapYear( int year )
{
return ( year % 4 == 0 && year % 100 != 0 || year % 400 == 0 );
}//
int daysInMonth( int year, int month )
{
switch( month )
{
case 1:case 3:
case 5:case 7:
case 8:case 10:
case 12:
return 31;
case 2:
if( isLeapYear( year ) )
return 29;
else
return 28;
default:
return 30;
}//
}//
int daysInYear( int year, int month, int day )
{
int nRet = 0;
//
//days in
//this year before current month
//
for( int m = 1; m < month; m++ )
nRet += daysInMonth( year, m );
//
//days in
//this year but in current month
//
nRet += day;
return nRet;
}//
long toDays( int year, int month, int day )
{
long nRet = ( year - 1 ) * 365;
//
//days in
//before this year
//
for( int y = 1; y < year; y++ )
if( isLeapYear( y ) )
nRet++;
return ( nRet += daysInYear( year, month, day ) );
}//
int toWeek( int year, int month, int day )
{
return toDays( year, month, day ) % 7;
}//
std::string weekToString( int day )
{
switch( day )
{
case 0: return std::string( "Sunday" );
case 1: return std::string( "Monday" );
case 2: return std::string( "Tuesday" );
case 3: return std::string( "Wednesday" );
case 4: return std::string( "Thursday" );
case 5: return std::string( "Friday" );
case 6: return std::string( "Saturday" );
}
}//
int f( int year, int month )
{
if( month <= 2 )
return year -1;
return year;
}//
int g( int month )
{
if( month <= 2 )
return month + 13;
return month + 1;
}//
long daysInTwoDays( int year1, int month1, int day1,
int year2, int month2, int day2,
int bToday = false )
{
long n1 = 1461 * f( year1, month1 ) / 4 + 153 * g( month1 ) / 5 + day1;
long n2 = 1461 * f( year2, month2 ) / 4 + 153 * g( month2 ) / 5 + day2;
return ( n2 - n1 ) ? n2 - n1 : n1 - n2;
}//
int compare( int year1, int month1, int day1,
int year2, int month2, int day2 )
{
if( year1 > year2 ) return 1;
if( year1 < year2 ) return -1;
if( year1 == year2 )
{
if( month1 > month2 ) return 1;
if( month1 < month2 ) return -1;
if( month1 == month2 )
{
if( day1 > day2 ) return 1;
if( day1 < day2 ) return -1;
}
}
}//
int weekInYear( int year, int month, int day )
{
//
//1. first Saturday of the year
//
int d1 = 1;
while( toWeek( year, 1, d1++ ) != 6 );
d1--;
/*std::cout<<daysInTwoDays( year, 1, d1,
year, month, day,
true )<<std::endl;
*/
return daysInTwoDays( year, 1, d1,
year, month, day,
true ) / 6;
}//
int main()
{
std::cout<<"Week of 2011, 1, 6 is "<<weekToString( toWeek( 2011, 1, 6 ) )<<std::endl;
std::cout<<"(2004-2-1)-(2005-9-20)="<<daysInTwoDays( 2004, 2, 1, 2005, 9, 20 )<<std::endl;
std::cout<<"Week's index of 2008, 3, 1 is "
<<weekInYear( 2008, 3, 1 )<<std::endl;
std::cout<<"Week's index of 2008, 1, 1 is "
<<weekInYear( 2008, 1, 1 )<<std::endl;
return 0;
}//