日期算法
/*
星期计算公式
(年+年/4+年/400-年/100-年基数+月基数+日)/7=……余星期几
注:式中分数均取整
年基数:平年1,闰年2,
月基数:
1、平年:一月0, 二月3, 三月3, 四月6, 五月1, 六月4,
七月0, 八月3, 九月5, 十月0, 十一月3, 十二月5.
2、闰年:一月0, 二月3, 三月4, 四月0, 五月2, 六月5,
七月0, 八月3, 九月6, 十月1, 十一月4, 十二月6.
如:1949年10月1日是星期几?
(1949+1949/4+1949/400-1949/100-1+0+1)/7
=(1949+487+4-19-1+0+1)/7
=345……6
即该日为星期六。
增加几个函数,用于计算星期
*/
闰年的判断方法:
整百的年份,能被4整除但不能被400整除的,不是闰年。
也就是说2000年是闰年,1900年、2100年等不是闰年。
地球绕太阳运行周期为365天5小时48分46秒(合365.24219天)即一回归年(tropical year)。公历的平年只有365日,比回归年短约0.2422 日,所余下的时间约为四年累计一天,故四年于2月加1天,使当年的历年长度为366日,这一年就为闰年。现行公历中每400年有97个闰年。按照每四年一个闰年计算,平均每年就要多算出0.0078天,这样经过四百年就会多算出大约3天来,因此,每四百年中要减少三个闰年。所以规定,公历年份是整百数的,必须是400的倍数的才是闰年,不是400的倍数的,虽然是4的倍数,也是平年,这就是通常所说的:四年一闰,百年不闰,四百年再闰。 例如,2000年是闰年,1900年则是平年。整百的年份,能被4整除但不能被400整除的,不是闰年。 也就是说2000年是闰年,1900年、2100年等不是闰年。
地球绕太阳运行周期为365天5小时48分46秒(合365.24219天)即一回归年(tropical year)。公历的平年只有365日,比回归年短约0.2422 日,所余下的时间约为四年累计一天,故四年于2月加1天,使当年的历年长度为366日,这一年就为闰年。现行公历中每400年有97个闰年。按照每四年一个闰年计算,平均每年就要多算出0.0078天,这样经过四百年就会多算出大约3天来, 因此,每四百年中要减少三个闰年。所以规定,公历年份是整百数的,必须是400的倍数的才是闰年,不是400的倍数的,虽然是4的倍数,也是平年,这就是通常所说的:四年一闰,百年不闰,四百年再闰。 例如,2000年是闰年,1900年则是平年。
使用C语言实现如下
INT8U is_leap_year( INT8U x ) //判断是否为闰年
{
} INT32U year; year = ( x / 16 * 10 ) + ( x & 15 ) + 2000; if( ( year % 4 == 0 && year % 100 != 0 ) || year % 400 == 0 ) return 1; else return 0;
INT8U jsxq( INT8U year, INT8U month, INT8U day )
{
INT8U flag = 0;//标识所给定的年份是否为闰年 INT8U year_j =0, month_j=0;//表示年基和月基 INT8U month_temp;//表示转换为十进制的月份 INT32U year_temp;//表示转换为十进制的年份 INT8U day_temp;//表示转换为十进制的日期 INT8U xq;//表示最后计算结果的星期 year_temp = ( year / 16 * 10 ) + ( year & 15 ) + 2000; month_temp = (month / 16 * 10)+( month & 15 ); day_temp = (day / 16 * 10)+( day & 15 ); flag = is_leap_year( year ); if( flag == 0) { year_j = 1; switch(month_temp) { case 1: case 7: case 10: month_j = 0; break; case 2: case 3: case 8: case 11:
} else { } break; case 4: month_j = 6; break; case 5: month_j = 1; break; case 6: month_j = 4; break; case 9: case 12: month_j = 5; break; default: break; year_j = 2; switch(month_temp) { case 1: case 4: case 7: month_j = 0; break; case 2: case 8: month_j = 3; break; case 3: case 11: month_j = 4; break; case 5: month_j = 2; break; case 6: month_j = 5; break; case 9:
} } month_j = 6; break; case 10: month_j = 1; break; default: break;
//(年+年/4+年/400-年/100-年基数+月基数+日)/7=……余星期几
//注:式中分数均取整
xq = ( year_temp + year_temp / 4 + year / 400 - year_temp / 100 - year_j + month_j + day_temp ) % 7 ;
return xq;
}
日期算法
/*
星期计算公式
(年+年/4+年/400-年/100-年基数+月基数+日)/7=……余星期几
注:式中分数均取整
年基数:平年1,闰年2,
月基数:
1、平年:一月0, 二月3, 三月3, 四月6, 五月1, 六月4,
七月0, 八月3, 九月5, 十月0, 十一月3, 十二月5.
2、闰年:一月0, 二月3, 三月4, 四月0, 五月2, 六月5,
七月0, 八月3, 九月6, 十月1, 十一月4, 十二月6.
如:1949年10月1日是星期几?
(1949+1949/4+1949/400-1949/100-1+0+1)/7
=(1949+487+4-19-1+0+1)/7
=345……6
即该日为星期六。
增加几个函数,用于计算星期
*/
闰年的判断方法:
整百的年份,能被4整除但不能被400整除的,不是闰年。
也就是说2000年是闰年,1900年、2100年等不是闰年。
地球绕太阳运行周期为365天5小时48分46秒(合365.24219天)即一回归年(tropical year)。公历的平年只有365日,比回归年短约0.2422 日,所余下的时间约为四年累计一天,故四年于2月加1天,使当年的历年长度为366日,这一年就为闰年。现行公历中每400年有97个闰年。按照每四年一个闰年计算,平均每年就要多算出0.0078天,这样经过四百年就会多算出大约3天来,因此,每四百年中要减少三个闰年。所以规定,公历年份是整百数的,必须是400的倍数的才是闰年,不是400的倍数的,虽然是4的倍数,也是平年,这就是通常所说的:四年一闰,百年不闰,四百年再闰。 例如,2000年是闰年,1900年则是平年。整百的年份,能被4整除但不能被400整除的,不是闰年。 也就是说2000年是闰年,1900年、2100年等不是闰年。
地球绕太阳运行周期为365天5小时48分46秒(合365.24219天)即一回归年(tropical year)。公历的平年只有365日,比回归年短约0.2422 日,所余下的时间约为四年累计一天,故四年于2月加1天,使当年的历年长度为366日,这一年就为闰年。现行公历中每400年有97个闰年。按照每四年一个闰年计算,平均每年就要多算出0.0078天,这样经过四百年就会多算出大约3天来, 因此,每四百年中要减少三个闰年。所以规定,公历年份是整百数的,必须是400的倍数的才是闰年,不是400的倍数的,虽然是4的倍数,也是平年,这就是通常所说的:四年一闰,百年不闰,四百年再闰。 例如,2000年是闰年,1900年则是平年。
使用C语言实现如下
INT8U is_leap_year( INT8U x ) //判断是否为闰年
{
} INT32U year; year = ( x / 16 * 10 ) + ( x & 15 ) + 2000; if( ( year % 4 == 0 && year % 100 != 0 ) || year % 400 == 0 ) return 1; else return 0;
INT8U jsxq( INT8U year, INT8U month, INT8U day )
{
INT8U flag = 0;//标识所给定的年份是否为闰年 INT8U year_j =0, month_j=0;//表示年基和月基 INT8U month_temp;//表示转换为十进制的月份 INT32U year_temp;//表示转换为十进制的年份 INT8U day_temp;//表示转换为十进制的日期 INT8U xq;//表示最后计算结果的星期 year_temp = ( year / 16 * 10 ) + ( year & 15 ) + 2000; month_temp = (month / 16 * 10)+( month & 15 ); day_temp = (day / 16 * 10)+( day & 15 ); flag = is_leap_year( year ); if( flag == 0) { year_j = 1; switch(month_temp) { case 1: case 7: case 10: month_j = 0; break; case 2: case 3: case 8: case 11:
} else { } break; case 4: month_j = 6; break; case 5: month_j = 1; break; case 6: month_j = 4; break; case 9: case 12: month_j = 5; break; default: break; year_j = 2; switch(month_temp) { case 1: case 4: case 7: month_j = 0; break; case 2: case 8: month_j = 3; break; case 3: case 11: month_j = 4; break; case 5: month_j = 2; break; case 6: month_j = 5; break; case 9:
} } month_j = 6; break; case 10: month_j = 1; break; default: break;
//(年+年/4+年/400-年/100-年基数+月基数+日)/7=……余星期几
//注:式中分数均取整
xq = ( year_temp + year_temp / 4 + year / 400 - year_temp / 100 - year_j + month_j + day_temp ) % 7 ;
return xq;
}