



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 东兴市市级机关选调真题2024
- 2024年五指山市招聘事业单位工作人员考试真题
- 2024年庆阳镇原县乡村小学全科型教师招聘真题
- 2024年河源市市直公办学校招聘教师考试真题
- 安徽电气工程职业技术学院《办公软件高级应用》2024-2025学年第一学期期末试卷
- 西藏警官高等专科学校《小学教师口语实训》2024-2025学年第一学期期末试卷
- 长春电子科技学院《飞行器动力系统》2024-2025学年第一学期期末试卷
- 网络的操作题题目及答案
- 哈尔滨应用职业技术学院《地热能及其利用技术》2024-2025学年第一学期期末试卷
- 郑州工业安全职业学院《森林培育与生态修复》2024-2025学年第一学期期末试卷
- 微积分的力量
- 中国股票市场投资实务(山东联盟)知到章节答案智慧树2023年山东工商学院
- 安徽宇邦新型材料有限公司年产光伏焊带2000吨生产项目环境影响报告表
- 号线项目tcms便携式测试单元ptu软件使用说明
- 艺术课程标准(2022年版)
- 癫痫所致精神障碍
- 卫生部手术分级目录(2023年1月份修订)
- 电荷及其守恒定律、库仑定律巩固练习
- YY 0666-2008针尖锋利度和强度试验方法
- GB/T 6663.1-2007直热式负温度系数热敏电阻器第1部分:总规范
- 小沈阳《四大才子》欢乐喜剧人台词
评论
0/150
提交评论