全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 保险保全员班组协作能力考核试卷含答案
- 热敏电阻红外探测器制造工岗前全能考核试卷含答案
- 水生物病害防治员常识竞赛考核试卷含答案
- 火锅料理师冲突管理能力考核试卷含答案
- 混凝土浇筑工岗前基础评估考核试卷含答案
- 竹藤家具制作工成果转化考核试卷含答案
- 2025辽宁省展览贸易集团有限公司及所属企业招聘6人考试笔试备考试题及答案解析
- 2025新华保险总部互联网业务部菁英人才招聘1人笔试历年参考题库附带答案详解
- 108.图书馆数字资源典藏策略制定与调整技能
- 2025安徽蚌埠固镇县工业投资(集团)有限公司招聘专业安全监管人员最终笔试历年参考题库附带答案详解
- 海上风电场的保险创新
- SONY索尼数码照相机DSC-HX200使用说明书
- 北师大版高考英语一轮复习选择性必修第2册UNIT4 HUMOUR课件
- 住宅机电施工图设计技术标准
- 动静脉瘘护理查房
- 保险行业职业生涯规划总结
- 施工现场临水临电标准化图册图文并茂
- 中国现当代文学史-13贾平凹的文学地理
- 大数据与会计专业职业生涯规划书2700字数
- 七年级上册小题狂做英语巅峰版2022电子版
- 组培基本操作技术-无菌操作(园艺植物组织培养)
评论
0/150
提交评论