得到某天星期几算法.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
得到某天星期几算法

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 + t[month - 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 )是星期w2 if(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这一规则做出的补正) 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计算式如下 if(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的计算式如下: 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_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 + wFirst

文档评论(0)

f8r9t5c + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8000054077000003

1亿VIP精品文档

相关文档