|
算法如下: 基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在公式中d表示日期中的日数,m表示月份数,y表示年数。 注意:在公式中有个与其他公式不同的地方: 把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。 代码如下: //y-年,m-月,d-日期 string CaculateWeekDay(int y,int m, int d) { if(m==1||m==2) { m+=12; y--; } int week=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; string weekstr=""; switch(week) { case 0: weekstr="星期一"; break; case 1: weekstr="星期二"; break; case 2: weekstr="星期三"; break; case 3: weekstr="星期四"; break; case 4: weekstr="星期五"; break; case 5: weekstr="星期六"; break; case 6: weekstr="星期日"; break; } return weekstr; } 大苏苏注:用来算现在真实日期的星期是没有问题的。 这个公式主要是以:“通常,每过1年,同一日期是星期几就要向后推1天”,是理解这个公式的关键。 要想知道某年某月某日是星期几,首先,要知道这一年元旦以公元元年元旦是星期一为起点, 有时候,想知道公元某年某月某日是星期几,可以用下面的公式算出来: ![]() 这里的方括号表示只取商的整数部分。式中: x:这一年是公元多少年。 y:这一天是这一年的第几天。 s:星期几。不过要先除以7,再取余数。没有余数是星期日,余数是1、2、3、4、5、6, 分别是星期一、星期二、星期三、星期四、星期五、星期六。 比如,今年国庆节(2010年10月1日)是星期几? x=2010。 y=31+28+31+30+31+30+31+31+30+1=31×5+30×3+28+1=274。 s=2010-1+502-20+5+274=2770,2770÷7余5。 所以,今年国庆节是星期五。 如果,你只想知道这个公式怎样用,到这儿就可以了。而要想知道这个公式的道理是什么,那可就说来话长了。 “星期制”是公元321年3月7日,古罗马皇帝君士坦丁宣布开始实行的,并且规定这一天为星期一。实际上,就是把公元元年元旦(公元1年1月1日)规定为星期一。(相当于公式中的x=1,y=1,所以s=1。) 通常1年有365天,365÷7=52……1,就是说比52个星期多1天。所以,同一个日期,下一年是星期几,就要比上一年向后推1天。比如,上一年元旦是星期三,下一年元旦就是星期四。 “通常,每过1年,同一日期是星期几就要向后推1天”,是理解这个公式的关键。 要想知道某年某月某日是星期几,首先,要知道这一年元旦以公元元年元旦是星期一为起点,已经把星期几向后推了多少天,还要知道这一天是这一年的第几天。而要知道这一年元旦已经把星期几向后推了多少天,可以从公元元年到这一年已经过了多少年算起,先按1年向后推1天计算,再根据闰年的规定进行调整。 闰年的规定是:年份是4的倍数的一般都是闰年,其中,年份是整百数的一般不是闰年,只有年份是400的倍数的才是闰年。 现在,可以解释公式中各部分的含义了。 ![]() 这样一来,s就是在公元元年元旦是星期一的基础上,需要把这一天是星期几向后推的总天数。所以,s除以7取余数,就能说明这一天是星期几。 上面的叙述是有点啰嗦,不过,通过对公式的解读,重温一下闰年的规定,顺便了解一点星期制的由来,还是值得的。何况这个公式的确很管用。比如,你想知道自己出生的那天是星期几,就可以算一算。再比如,你想知道爸妈的金婚纪念日是星期几,也可以预先算出来。不是挺有意思吗? 在1900-2099期间倒是一致。 如果换做汉唐的时间就出问题了。 “不受1900-2099年的限制”有待商榷 。 翻了下许老师的代码,下面这段代码必须有,否则到明朝时间就错了。 [size=1em][size=1em]view sourceprint? [size=1em][size=1em]
[size=1em]
[size=1em]
[size=1em]
[size=1em]
[size=1em]
[size=1em]
[size=1em]
[size=1em]
[size=1em]
[size=1em]
[size=1em]
不过STM32的RTC显示时钟只能从1970~2106年,强行穿越到明朝是要出问题的。 |
| 多谢分享 |
| 多谢分享 |
| 谢谢分享! |
| 多谢分享! |
| 图贴的不行, |
所以只是日历而不是万年历 |
微信公众号
手机版