得到某天星期几的算法.doc_第1页
得到某天星期几的算法.doc_第2页
得到某天星期几的算法.doc_第3页
得到某天星期几的算法.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

static int getWeekDay(DateTime date) int t = 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 ; int month = date.Month; int day = date.Day; int year = date.Year; int weekday = 0; year -= month 3 ? 1 : 0; weekday = (year + year / 4 - year / 100 + year / 400 + tmonth - 1 + day) % 7; return weekday; 得到某年某月某日是星期几的算法.一般的想法是.从一个已知星期几的天数开始(比如2000年1月1日为星期六),作为参考点.先计算出从这个参考点到将要计算的某年某月某日经过了多少天.假设到2001年1月1日为366天.则2001年1 月1日为星期2(366%7=2).这个基本算法要从参考点出发,得到经过了多少天. 因为润年有366天.这样的话就要计算经过的年间是否有润年.而本文介绍的算法.优雅简短.是由Tomohiko Sakamoto提出的一个得到星期几的优秀算法要了解这个算法,首先必须知道以下知识.平年365天52*7 + 1润年366天52*7 + 2规则1:每经过一个平年,对应日期的星期号递增1;规则2:每经过一个润年,3月前对应日期的星期号递增1,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月前对应日期的星期号递增1,3月开始对应日期的星期号递增2这一规则做出的补正)elsew2 = (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计算式如下if(isLeap(y)w3 = (y + y/4-y/100+y/400 - 1 + wFirstDayOfMonth_Leapm + d + H)%7;elsew3 = (y + y/4-y/100+y/400 + wFirstDayOfMonth_noLeapm + d + H)%7;对比平年和润年的月初日星期表,差异产生在 2月的第29日,再考虑以上两个计算式的差异-1,可以将两个月初表合二为一。如果取平年的月初日星期表,则 y/m/d 的星期号w的计算式如下:static int wFirstDayOfMonth_noLeap=0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5;if(m2)w = (y + y/4-y/100+y/400 + wFirstDayOfMonth_Leapm-1 + d +6 -1) % 7; / 使用了润年的月初日星期表,2月后要 -1elsew = (y + y/4-y/100+y/400 + wFirstDayOfMonth_Leapm-1 + d + 6) % 7;算法还可以优化吗?算法中有2个计算式,它们之间关系密切润年判断式:isLeap(y) = ( (y%4=0)&(y%100!=0) ) | (y%400=0);润年数计算式: cntLeap(y) = y/4-y/100+y/400;如果 y 是润年,则 cntLeap(y-1) = cntLeap(y) - 1 ;如果 y 是平年,则 cntLeap(y-1) = cntLeap(y) ;static int wFirstDayOfMonth_noLeap=0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5;if(m3)y-; / 期望通过y的变形来统一公式. 通过尝试,结果是可喜的! 消除了润年判断。if(leap(y)w = (y+1 + y/4-y/100+y/400+1 + wFirstDayOfMonth_noLeapm-1 + d + 5) % 7;elsew = (y+1 + y/4-y/100+y/400 + wFirstDayOfMonth_noLeapm-1 + d + 6) % 7;elsew = (y + y/4-y/100+y/400 + wFirstDayOfMonth_noLeapm-1 + d + 6) % 7;以上程序等价于static int wFirstDayOfMonth_noLeap=0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5;y -= m3;if(m3)w = (y + y/4-y/100+y/400 + wFirstDayOfMonth_noLeapm-1 + d) % 7;elsew = (y + y/4-y/100+y/400 + wFirstDayOfMonth_noLeapm-1 + d + 6) % 7;通过修改312月的月初日星期号,得到下面的程序:static int

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论