51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机技术文章 > 51单片机 > 详细内容
新编万年历星期速算法【精】
发布时间:2009/7/5  阅读次数:1944  字体大小: 【】 【】【

作者:电子白菜

新编万年历星期速算法(HotPower 2004.6.2)
推导过程:
1。平年365天(52周+1天),闰年366天(52周+2天)。平年2月28天,闰年2月29天。
      由于公元1月1日设为星期六,故3月1日为星期三。                  ——注意这个“三”
      为使算法达到最简,故本算法以“星期”为计算单位。且选3月1日为基月。
2。每400年整一闰,或每4年且不为百年的一闰。
      百年%4=0闰或(年%4=0并且年<>0)闰。
3。每 4年(3个平年+1个闰年)共208周+5天                                    ——注意这个“5天”
      每百年共100*(208周+5天)-1天=5217周+5天                            ——注意这个“5天”(整
百年暂设为平年)
      每400年共4*(5217周+5天)+1天(整400年闰)=20871周+0天——注意这个“0天”和
“1天”(4个整百年只有一个闰年)
      即400年一轮回!(原来万年历400年前是一家)
4。万年3月1日星期算法(记住那个三)
      公式:某年3月1日星期几=(3天+百年%4*5天+年/4*5天+年%4+月星期表+日-1天)%7
                  某年3月1日星期几=(百年%4*5天+年/4*5天+年%4+月星期表+日+2天)%7
      或        某年3月1日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7
      
      闰4百年3月1日星期算法(百年%4=0)
      公式:某年3月1日星期几=(年+年/4+月星期表+日+2天)%7
      例:0000年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三
              1600年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三
              2000年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三
              2001年3月1日星期几=(1+1/4+0+1+2)%7=4%7=星期四
              2004年3月1日星期几=(4+4/4+0+1+2)%7=8%7=星期一
              2008年3月1日星期几=(8+8/4+0+1+2)%7=13%7=星期六
              2042年3月1日星期几=(42+42/4+0+1+2)%7=55%7=星期六

      平4百年3月1日星期算法(百年%4<>0)
      公式:某年3月1日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7
      例:1700年3月1日星期几=(17%4*5+0+0/4+0+1+2)%7=8%7=星期一(注意:1700年是平
年)
              1800年3月1日星期几=(18%4*5+0+0/4+0+1+2)%7=13%7=星期六(注意:1800年是平
年)
              1900年3月1日星期几=(19%4*5+0+0/4+0+1+2)%7=18%7=星期四(注意:1900年是平
年)
              1901年3月1日星期几=(19%4*5+1+1/3+0+1+2)%7=19%7=星期五
              1918年3月1日星期几=(19%4*5+18+18/4+0+1+2)%7=(15+22+3)%7=40%7=星期五
              1958年3月1日星期几=(19%4*5+58/4*5+58%4+3)%7=(15+70+2+3)%7=90%7=星期六
              1988年3月1日星期几=(19%4*5+88/4*5+88%4+3)%7=(15+110+0+3)%7=128%7=星期二
              1999年3月1日星期几=(19%4*5+99/4*5+99%4+3)%7=(15+120+3+3)%7=141%7=星期一
              2100年3月1日星期几=(21%4*5+0/4*5+0%4+3)%7=(5+0+0+3)%7=8%7=星期一(注意:
2100年是平年)
              2101年3月1日星期几=(21%4*5+1/4*5+1%4+3)%7=(5+0+1+3)%7=9%7=星期二
              2102年3月1日星期几=(21%4*5+2/4*5+2%4+3)%7=(5+0+2+3)%7=10%7=星期三
              2103年3月1日星期几=(21%4*5+3/4*5+3%4+3)%7=(5+0+3+3)%7=11%7=星期四
              2104年3月1日星期几=(21%4*5+4/4*5+4%4+3)%7=(5+1+0+3)%7=9%7=星期二(注意:
2104年是闰年)
              9999年3月1日星期几=(99%4*5+99/4*5+99%4+3)%7=(120+15+3+3)%7=141%7=星期一
      注:按400年一轮回!(400年前是一家)的说法
              1600年,2000年是一样的
              1700年,2100年是一样的
              1800年,2200年是一样的
              1900年,2300年是一样的
              所以,万年历实际上是骗人的,应该叫“四百年历”才是。万只是多的意思罢了。
5. 万年某日星期算法    
      公式:某日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7
      通同星期偏差表
      闰年    1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
      天数      31    29    31    30    31    30    31    31    30    31      30      31
      星期      3      6      0      3      5      1      3      6      2      4        0        2
      平年    1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
      天数      31    28    31    30    31    30    31    31    30    31      30      31
      星期      4      0      0      3      5      1      3      6      2      4        0        2
6. 2004年(今年)世上最“弱智”的算法
      先复习以上算法,取公式:
      某年某日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7
      通同星期偏差表(闰年表)
                1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
      天数    31    29    31    30    31    30    31    31    30    31      30      31
      星期    3      6      0      3      5      1      3      6      2      4        0        2

      将2004年代入。得(其中百年=20,年=04)
      2004某日星期几=(20%4*5天+4+4/4+月星期表+日+2天)%7
                          =(0*5天+4天+1天+月星期表+日+2天)%7
                          =(5天+月星期表+日+2天)%7
                  =(7天+月星期表+日)%7
                  =(月星期表+日)%7
                  =(月星期表%7+日%7)%7
      所以,2004年的算法最简单,几乎不用计算。

7.现以今年的重大节日为例:
    2004年元旦        1月表=3    1日=1    故3+1=4 即2004年元旦是星期四
    2004年春节        1月表=3 22日=1    故3+1=4 即2004年春节是星期四
    2004年元宵节    2月表=6    5日=5    故6+5=4 即2004年元宵节是星期四                        
    2004年妇女节    3月表=0    8日=1    故0+1=1 即2004年妇女节是星期一                        
    2004年植树节    3月表=0 12日=5    故0+5=5 即2004年植树节是星期五                        
    2004年投诉节    3月表=0 15日=1    故0+1=1 即2004年投诉节是星期一
    2004年清明节    4月表=3    4日=4    故3+4=0 即2004年清明节是星期天
    2004年五一节    5月表=5    1日=1    故5+1=6 即2004年五一节是星期六
    2004年青年节    5月表=5    4日=4    故5+4=2 即2004年青年节是星期二
    2004年母亲节    5月表=5    9日=2    故5+2=0 即2004年母亲节是星期天
    2004年儿童节    6月表=1    1日=1    故1+1=2 即2004年儿童节是星期二
    2004年端午节    6月表=1 22日=1    故1+1=2 即2004年端午节是星期二
    2004年建党节    7月表=3    1日=1    故3+1=4 即2004年建党节是星期四
    2004年建军节    8月表=6    1日=1    故6+1=0 即2004年建军节是星期天
    2004年父亲节    8月表=6    8日=1    故6+1=0 即2004年父亲节是星期天
    2004年教师节    9月表=2 10日=3    故2+3=5 即2004年教师节是星期五
    2004年中秋节    9月表=2 28日=0    故2+0=2 即2004年中秋节是星期二
    2004年国庆节 10月表=4    1日=1    故4+1=5 即2004年国庆节是星期五
    2004年老人节 10月表=4    6日=6    故4+6=3 即2004年老人节是星期三
    2004年重阳节 10月表=4 22日=1    故4+1=5 即2004年重阳节是星期五
    2004年立冬节 11月表=0    7日=7    故0+7=0 即2004年立冬节是星期天
    2004年冬至节 12月表=2 21日=0    故2+0=2 即2004年冬至节是星期二
8。二十世纪任意日期举例(19%4*5=15)
      公式:某日星期几=(百年%4*5天+年+年/4+平年月星期表+日+2天)%7
                                      =(19%4*5天+年+年/4+平年月星期表+日+2天)%7
                                      =(15天+年+年/4+平年月星期表+日+2天)%7
      即:    某日星期几=(年+年/4+平年月星期表+日+3天)%7

    1900年元旦            1日=(0/4*5+0%4+1+3)%7=(0+0+4)%7=4
                                  1月表=4(平年)        故 4+4=1 即1900年元旦是星期一
    1918年大寒          21日=(18/4*5+18%4+21+3)%7=(20+2+24)%7=4
                                  1月表=4(平年)        故 4+4=1 即1918年春节是星期一
    1918年春节          11日=(18/4*5+18%4+11+3)%7=(20+2+14)%7=1
                                  2月表=0(平年)        故 0+1=1 即1918年春节是星期一
    1927年元旦            1日=(27/4*5+27%4+1+3)%7=(30+3+4)%7=2
                                  1月表=4(平年)        故 4+2=6 即1927年元旦是星期六
    1948年腊八节      18日=(48/4*5+48%4+18+3)%7=(60+21)%7=4
                                  1月表=3(闰年)        故 3+4=0 即1927年元旦是星期天
    1949年国庆            1日=(49/4*5+49%4+1+3)%7=(60+1+4)%7=2
                                  10月表=4(平年)        故 4+2=6 即1949年国庆是星期六
    1962年劳动节        1日=(62/4*5+62%4+1+3)%7=(75+2+4)%7=4
                                    5月表=5(平年)        故 5+4=2 即1962年劳动节是星期二
    1999年12月31日 31日=(99/4*5+99%4+31+3)%7=(120+3+34)%7=3
                                  12月表=2(平年)        故 2+3=5 即1999年12月31日是星期五
9.二十一世纪新前年虫算法(20%4*5=0)
      公式:某日星期几=(百年%4*5天+年+年/4+闰年月星期表+日+2天)%7
                                      =(20%4*5天+年+年/4+闰年月星期表+日+2天)%7
      即:    某日星期几=(年+年/4+闰年月星期表+日+2天)%7

    2000年元旦            1日=(0+0/4+1+2)%7=(0+0+1+2)%7=3
                                  1月表=3(闰年)        故 3+3->6 即2027年元旦是星期六
    2018年大寒          20日=(18+18/4+20+2)%7=(18+4+20+2)%7=2
                                  1月表=4(平年)        故 4+2->6 即2018年大寒是星期六
    2018年春节          16日=(18+18/4+16+2)%7=(18+4+16+2)%7=5
                                  2月表=0(平年)        故 0+5=5 即2018年春节是星期五
    2027年元旦            1日=(27+27/4+1+2)%7=(3+30+3)%7=1
                                  1月表=4(平年)        故 4+1=5 即2027年元旦是星期五
    2048年腊八节      22日=(48/4*5+48%4+22+2)%7=(60+24)%7=0
                                  1月表=3(闰年)        故 3+0=3 即2027年腊八是星期三
    2099年12月31日 31日=(99/4*5+99%4+31+2)%7=(120+3+33)%7=2
                                  12月表=2(平年)        故 2+2=4 即2099年12月31日是星期四

10。二十二世纪任意日期举例(21%4*5=5)(接缝验证)
      公式:某日星期几=(百年%4*5天+年+年/4+平年月星期表+日+2天)%7
                                      =(21%4*5天+年+年/4+平年月星期表+日+2天)%7
                                      =(5天+年+年/4+平年月星期表+日+2天)%7
      即:    某日星期几=(年+年/4+平年月星期表+日)%7

    2100年元旦            1日=(0/4*5+0%4+1)%7=(0+0+1)%7=1
                                  1月表=4(平年)        故 4+1=4 即2100年元旦是星期五
    2100年1月31日    31日=(0/4*5+0%4+31)%7=(0+0+31)%7=3
                                  1月表=4(平年)        故 4+3=0 即2100年1月31日是星期天
    2100年2月1日        1日=(0/4*5+0%4+1)%7=(0+0+1)%7=1
                                  2月表=0(平年)        故 0+1=1 即2100年2月1日是星期一
    2100年2月28日    28日=(0/4*5+0%4+28)%7=(0+0+28)%7=0
                                  2月表=0(平年)        故 0+0=0 即2100年2月28日是星期天
    2100年3月1日        1日=(0/4*5+0%4+1)%7=(0+0+1)%7=1
                                  3月表=0(平年)        故 0+1=1 即2100年3月1日是星期一
    2100年3月31日    31日=(0/4*5+0%4+31)%7=(0+0+31)%7=3
                                  3月表=0(平年)        故 0+3=3 即2100年3月31日是星期三
    2100年12月31日 31日=(0/4*5+0%4+31)%7=(0+0+31)%7=3
                                  12月表=2(平年)        故 2+3=5 即2101年12月31日是星期五
    2101年元旦            1日=(1/4*5+1%4+1)%7=(0+1+1)%7=2
                                  1月表=4(平年)        故 4+2=6 即2101年元旦是星期六
    2101年1月31日    31日=(1/4*5+1%4+31)%7=(0+1+31)%7=4
                                  1月表=4(平年)        故 4+4=1 即2101年1月31日是星期一
    2101年2月1日        1日=(0/4*5+1%4+1)%7=(0+1+1)%7=2
                                  2月表=0(平年)        故 0+2=2 即2101年2月1日是星期二
    2101年2月28日    28日=(0/4*5+1%4+28)%7=(0+1+28)%7=1
                                  2月表=0(平年)        故 0+1=1 即2101年2月28日是星期一
    2101年3月1日        1日=(0/4*5+1%4+1)%7=(0+1+1)%7=2
                                  3月表=0(平年)        故 0+2=2 即2101年3月1日是星期二
    2101年3月31日    31日=(0/4*5+1%4+31)%7=(0+1+31)%7=4
                                  3月表=0(平年)        故 0+4=4 即2101年3月31日是星期四
    2101年12月31日 31日=(0/4*5+1%4+31)%7=(0+1+31)%7=4
                                  12月表=2(平年)        故 2+4=6 即2101年12月31日是星期六
    2104年2月29日    29日=(0/4*5+1%4+29)%7=(0+1+29)%7=2
                                  2月表=6(闰年)        故 6+2=1 即2104年2月29日是星期一
    2104年3月1日        1日=(0/4*5+1%4+1)%7=(0+1+1)%7=2
                                  3月表=0(闰年)        故 0+2=2 即2104年3月1日是星期二
    2199年12月31日 31日=(99/4*5+99%4+31)%7=(120+3+31)%7=0
                                  12月表=2(平年)        故 2+0=2 即2199年12月31日是星期二
  

我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号