找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5252|回复: 3
打印 上一主题 下一主题
收起左侧

一个非常简洁的计算星期几的程序

[复制链接]
跳转到指定楼层
楼主
ID:68618 发表于 2014-11-22 15:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
蔡勒(Zeller)公式:是一个计算星期的公式。
随便给一个日期,就能用这个公式推算出是星期几。

蔡勒公式如下:
W = [ C/4 ] - 2C + y + [ y/4 ] + [ 13 * (M + 1) / 5] + d -1


公式中的符号含义如下:
W: 星期; w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六
C: 世纪-1(前两位数)
y: 年(后两位数)
m: 月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算)
d: 日
[ ]代表取整,即只要整数部分。

下面以中华人民共和国成立100周年纪念日那天(2049年10月1日)来计算是星期几,过程如下:
w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
=49+[49/4]+[20/4]-2×20+[26×(10+1)/10]+1-1
=49+[12.25]+5-40+[28.6]
=49+12+5-40+28
=54 (除以7余5)
即2049年10月1日(100周年国庆)是星期五。

再比如计算2006年4月4日,过程如下:
w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
=6+[6/4]+[20/4]-2*20+[26*(4+1)/10]+4-1
=-12 (除以7余2,注意对负数的取模运算!)

      不过,以上的公式都只适合于1582年(我国明朝万历十年)10月15日之后的情形。罗马教皇格里高利十三世在1582年组织了一批天文学家,根据哥白尼日心说计算出来的数据,对儒略历作了修改。将1582年10月5日到14日之间的10天宣布撤销,继10月4日之后为10月15日。后来人们将这一新的历法称为“格里高利历”,也就是今天世界上所通用的历法,简称格里历或公历。  

程序一:
// 计算2000~2099年任一天星期几
// year    : 00-99
// month: 01-12
// day     : 01-31
unsigned char GetWeekFromDay(unsigned char year,unsigned char month,unsigned char day)
{
    if( month == 1 || month == 2 )   
    {
        month += 12;
        if( year > 0 )
            year--;
        else
            year = 4;
    }

    // 返回星期几(星期一用1表示,而星期天用7表示)
    return 1+(( day + 2*month + 3*(month+1)/5 + year + year/4 ) %7);
}  

程序二:这个算法效率比一高好多。。。。

//论空间还是时间,另外,扩展个几千年也很容易。
//51的话,可以定义在CODE,不光省RAM,还节省代码空间(少一条MOV指令)。
uchar        WeekData[]={0,3,3,6,1,4,6,2,5,0,3,5};
/*2000-2099*/
unsigned char GetWeekDay(unsigned char year,unsigned char month,unsigned char day)  
{
        return        ((6+WeekData[month-1]+year+day+year/4)%7);
}

这里0代表星期天,使用者应该加上日前限定的功能。

学习之。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:325735 发表于 2022-5-16 15:05 | 只看该作者
方法二真 牛逼   感谢
回复

使用道具 举报

板凳
ID:195496 发表于 2022-10-21 14:45 | 只看该作者
方法二算出来的不对,方法一算出来的正确
回复

使用道具 举报

地板
ID:1064915 发表于 2023-8-8 17:31 | 只看该作者
2023.8.8用方法二算出来是星期三
实际是星期二,哪里错了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表