星期几:
Kim Larsen Calculation Formula:请耐心看完噢,想了好久好久才写出来的。
if(month == 2 || month == 1) {
month+=12;
--year;
}
int weekday=(day + 1 + 2*month + 3*(month+1)/5 + year + year/4 - year/100 + year/400)%7;
(年份偏差) 365 = 7*52+1: 一年后的同一天星期滞后一天,所以多一年多一天(+year)%7
为偏移的星期。
其中year/4 - year/100 + year/400
是因为闰年为366天比365多一天:修正闰年还要多滞后一天。
(月份偏差) 一月 和 二月当成去年的 13月和14月,并且假设每个月都是28天:其中最初始的一月一日星期一,所以三月一日是星期三:即日子偏差为应当为(day+2+年份偏差+月份偏差)。
之后-1+2*month + 3*(month+1)/5
为第month(3<=month<=14)月的偏移值(%7
为星期的偏移量),可以验算一下:
{0 3 5 1 3 6 2 4 0 2 5 1 }为从3月到2月每个月的星期偏差值。三月从周二开始没有偏差,但三月为31天(4*7+3)使得四月偏差3天。依次类推,可知公式正确。
综合 为(day+ 2*month + 3*(month+1)/5 + year + year/4 - year/100 + year/400 + 1)%7。
日子相差多少天:
从上述可得知:如果是输入两个日期。可计算与某一个相同的日子相差多少天。相减便可。
距离0年0月0日的日子有
int days=365*year+year/4-year/100+year/400+month*28+2*month+3*(month+1)/5+day;