资源描述:
《得到某天星期几算法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、staticintgetWeekDay(DateTimedate){int[]t={0,3,2,5,0,3,5,1,4,6,2,4};intmonth=date.Month;intday=date.Day;intyear=date.Year;intweekday=0;year-=month<3?1:0;weekday=(year+year/4-year/100+year/400+t[month-1]+day)%7;returnweekday;}得到某年某月某日是星期几的算法..一般的想法是..从一个已知星期几的天数开始(比如2000年1月1日为星期六)
2、,作为参考点.先计算出从这个参考点到将要计算的某年某月某日经过了多少天..假设到2001年1月1日为366天.则2001年1月1日为星期2(366%7=2).这个基本算法要从参考点出发,得到经过了多少天.因为润年有366天.这样的话就要计算经过的年间是否有润年.而本文介绍的算法.优雅简短.是由TomohikoSakamoto提出的一个得到星期几的优秀算法要了解这个算法,首先必须知道以下知识.平年365天=52*7+1润年366天=52*7+2规则1:每经过一个平年,对应日期的星期号递增1;规则2:每经过一个润年,3月前对应日期的星期号递增1,3月开始对
3、应日期的星期号递增2。年y的第cd天(cd=∑dayOfMon+d)是星期w2if(isLeap(y)) w2=(y+y/4-y/100+y/400-1+cd+H)%7;//假设经过y年,y/4-y/100+y/400得到y年间润年数.这里-1是因为表达式(y/4-y/100+y/400)对于润年y已经计算了偏移1(注意规则2,y/4-y/100+y/400把当年为润年的偏移1也计算了进去的意思是,因为2月29天是多出来的一天.所以3月开始,这里的-1会被这多出来的一天补正,而3月前对应的星期号不应该加上这多出来的一天,-1即是为了满足3月前对应
4、日期的星期号递增1,3月开始对应日期的星期号递增2这一规则做出的补正)else w2=(y+y/4-y/100+y/400+cd+H)%7;原文:如果将每月第1天的星期号建立一个表,取名叫月初日星期表,则可用查表的方法代替计算∑dayOfMon。假设1月1日是星期0(星期天),则平年和润年的月初日星期表分别为wFirstDayOfMonth_noLeap[]={0,3,3,6,1,4,6,2,5,0,3,5};wFirstDayOfMonth_Leap[]={0,3,4,0,2,5,0,4,6,1,4,6};于是y/m/d的星期号w3计算式如下i
5、f(isLeap(y)) w3=(y+y/4-y/100+y/400-1+wFirstDayOfMonth_Leap[m]+d+H)%7;else w3=(y+y/4-y/100+y/400+wFirstDayOfMonth_noLeap[m]+d+H)%7;对比平年和润年的月初日星期表,差异产生在2月的第29日,再考虑以上两个计算式的差异"-1",可以将两个月初表合二为一。如果取平年的月初日星期表,则y/m/d的星期号w的计算式如下:staticintwFirstDayOfMonth_noLeap[]={0,3,3,6,1,4,6,2,5
6、,0,3,5};if(m<3){ y--;//期望通过y的变形来统一公式...通过尝试,结果是可喜的!消除了润年判断。 if(leap(y)) { w=(y+1+y/4-y/100+y/400+1+wFirstDayOfMonth_noLeap[m-1]+d+5)%7; } else { w=(y+1+y/4-y/100+y/400+wFirstDayOfMonth_noLeap[m-1]+d+6)%7; } }else w=(y+y/4-y/100+y/400+wFirstDayOfMonth_noLeap[m-1]+d+6)%7;如果取润年的月
7、初日星期表,则y/m/d的星期号w的计算式如下: staticintwFirstDayOfMonth_Leap[]={0,3,4,0,2,5,0,3,6,1,4,6}; if(leap(y)) { w=(y+y/4-y/100+y/400-1+wFirstDayOfMonth_Leap[m-1]+d+6)%7; } else { if(m>2) w=(y+y/4-y/100+y/400+wFirstDayOfMonth_Leap[m-1]+d+6-1)%7;//使用了润年的月初日星期
8、表,2月后要-1 else w=(y+y/4-y/100+y/400+wF