得到某天星期几算法

得到某天星期几算法

ID:24048920

大小:39.50 KB

页数:4页

时间:2018-11-12

得到某天星期几算法_第1页
得到某天星期几算法_第2页
得到某天星期几算法_第3页
得到某天星期几算法_第4页
资源描述:

《得到某天星期几算法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。