蔡勒公式(巧妙计算星期几)
给出年月日,计算星期几--算法及算法来历

= 2524;
2524 / 7 = 360……4.这和实际是一致的。
公式(5)已经是从年、月、日来算星期几的公式了,但它还不是最简练的,对于年份的处理还有改进的方法。我们先来用这个公式算出每个世纪第一年3月1日的星期,列表如下:
因为其中的-7和(M-1)*28两项都可以被7整除,所以去掉这两项,W除以7的余数不变,公式变成:
W = (Y-1) + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + [ 13 * (M+1) / 5 ] + d.
(5)
D = [ 13 * (M+1) / 5 ] - 7 + (M-1) * 28 + d. (3≤M≤14) (4)
上面计算星期几的公式,也就可以进一步简化成:
W = (Y-1) + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + [ 13 * (M+1) / 5 ] - 7 + (M-1) * 28 + d.
(Y-1)*365 ≡ Y-1 (mod 7).
其中,≡是数论中表示同余的符号,mod 7的意思是指在用7作模数(也就是除数)的情况下≡号两边的数是同余的。因此,完全可以用(Y-1)代替(Y-1)*365,这样我们就得到了那个著名的、也是最常见到的计算星期几的公式:
W = (Y-1) + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D. (2)
显然,W这么大的原因是因为公式中的第一项(Y-1)*365太大了。其实,
判断具体某一天是星期几

最后写一个很有用的星期的介绍如何计算某一天是星期几?——蔡勒(Zeller)公式历史上的某一天是星期几?未来的某一天是星期几?关于这个问题,有很多计算公式(两个通用计算公式和一些分段计算公式),其中最著名的是蔡勒(Zeller)公式。
即w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1公式中的符号含义如下,w:星期;c:世纪-1;y:年(两位数);m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算);d:日;[ ]代表取整,即只要整数部分。
(C 是世纪数减一,y是年份后两位,M是月份,d是日数。
1月和2月要按上一年的13月和14月来算,这时C和y均按上一年取值。
)算出来的W除以7,余数是几就是星期几。
如果余数是0,则为星期日。
以2049年10月1日(100周年国庆)为例,用蔡勒(Zeller)公式进行计算,过程如下:蔡勒(Zeller)公式: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周年国庆)是星期5。
你的生日(出生时、今年、明年)是星期几?不妨试一试。
不过,以上公式只适合于1582年10月15日之后的情形(当时的罗马教皇将恺撒大帝制订的儒略历修改成格里历,即今天使用的公历)。
过程的推导:(对推理不感兴趣的可略过不看)星期制度是一种有古老传统的制度。
据说因为《圣经·创世纪》中规定上帝用了六天时间创世纪,第七天休息,所以人们也就以七天为一个周期来安排自己的工作和生活,而星期日是休息日。
从实际的角度来讲,以七天为一个周期,长短也比较合适。
计算某天是星期几

计算某天是星期几(含六个例程)计算某天是星期几,最常见的公式: W = [Y-1] + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D Y是年份数,D是这一天在这一年中的累积天数,也就是这一天在这一年中是第几天。
计算某天是星期几,最常见的公式:W=[Y-1]+[(Y-1)/4]-[(Y-1)/100]+[(Y-1)/400]+DY是年份数,D是这一天在这一年中的累积天数,也就是这一天在这一年中是第几天。
最好用的是蔡勒公式:W=[C/4]-2C+y+[y/4]+[13*(M+1)/5]+d-1C是世纪数减一,y是年份后两位,M是月份,d是日数。
1月和2月要按上一年的13月和14月来算,这时C和y均按上一年取值。
两个公式中的[...]均指只取计算结果的整数部分。
算出来的W除以7,余数是几就是星期几。
如果余数是0,则为星期日。
星期制度是一种有古老传统的制度。
据说因为《圣经〃创世纪》中规定上帝用了六天时间创世纪,第七天休息,所以人们也就以七天为一个周期来安排自己的工作和生活,而星期日是休息日。
从实际的角度来讲,以七天为一个周期,长短也比较合适。
所以尽管中国的传统工作周期是十天(比如王勃《滕王阁序》中说的“十旬休暇”,即是指官员的工作每十日为一个周期,第十日休假),但后来也采取了西方的星期制度。
在日常生活中,我们常常遇到要知道某一天是星期几的问题。
有时候,我们还想知道历史上某一天是星期几。
通常,解决这个方法的有效办法是看日历,但是我们总不会随时随身带着日历,更不可能随时随身带着几千年的万年历。
假如是想在计算机编程中计算某一天是星期几,预先把一本万年历存进去就更不现实了。
这时候是不是有办法通过什么公式,从年月日推出这一天是星期几呢?答案是肯定的。
其实我们也常常在这样做。
我们先举一个简单的例子。
比如,知道了2004年5月1日是星期六,那么2004年5月31日“世界无烟日”是星期几就不难推算出来。
蔡勒公式——计算星期几

如何计算某一天是星期几?——蔡勒(Zeller)公式历史上的某一天是星期几?未来的某一天是星期几?关于这个问题,有很多计算公式(两个通用计算公式和一些分段计算公式),其中最著名的是蔡勒(Zeller)公式。
即w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1公式中的符号含义如下,w:星期;c:世纪-1;y:年(两位数);m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算);d:日;[ ]代表取整,即只要整数部分。
(C是世纪数减一,y是年份后两位,M是月份,d是日数。
1月和2月要按上一年的13月和14月来算,这时C和y均按上一年取值。
)算出来的W除以7,余数是几就是星期几。
如果余数是0,则为星期日。
以2049年10月1日(100周年国庆)为例,用蔡勒(Zeller)公式进行计算,过程如下:蔡勒(Zeller)公式: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周年国庆)是星期5。
你的生日(出生时、今年、明年)是星期几?不妨试一试。
不过,以上公式只适合于1582年10月15日之后的情形(当时的罗马教皇将恺撒大帝制订的儒略历修改成格里历,即今天使用的公历)。
过程的推导:(对推理不感兴趣的可略过不看)星期制度是一种有古老传统的制度。
据说因为《圣经·创世纪》中规定上帝用了六天时间创世纪,第七天休息,所以人们也就以七天为一个周期来安排自己的工作和生活,而星期日是休息日。
从实际的角度来讲,以七天为一个周期,长短也比较合适。
所以尽管中国的传统工作周期是十天(比如王勃《滕王阁序》中说的“十旬休暇”,即是指官员的工作每十日为一个周期,第十日休假),但后来也采取了西方的星期制度。
蔡勒公式的推导过程

蔡勒公式的推导过程蔡勒公式是一种计算星期几的公式,被广泛应用于日历、时间和天文学等领域。
它基于一种数学方法,通过一系列简单的计算,能够快速准确地确定任意日期是星期几。
下面我们来看看蔡勒公式的推导过程。
我们需要了解一个基本概念:闰年。
闰年是指公历年份中除以4余数为0但除以100余数不为0或者除以400余数也为0的年份。
例如,2000年是闰年,1900年不是闰年。
接下来,我们来分析蔡勒公式的计算过程。
假设要计算的日期为YYYY年MM月DD日,我们首先需要将月份转换为“调整后的月份”(Adjusted Month)。
转换公式如下:若MM为1或2月,则将年份-1,月份变为13或14月,即:A = YYYY - 1B = 13 (或14)否则,A = YYYY,B = MM接下来,我们计算“世纪数”(Century)和“世纪年”(Century Year)。
世纪数的计算公式为:C = INT(A / 100)世纪年的计算公式为:D = A - 100 * C接着,我们计算“闰年修正值”(Leap Correction)和“世纪年修正值”(Century Year Correction)。
闰年修正值的计算公式为:E = INT(26 * (B + 1) / 10) - 2 * C + D + INT(D / 4) + INT(C / 4)世纪年修正值的计算公式为:F = 5 * C + D我们可以根据以下公式计算星期几(Weekday):Weekday = (E + F + DD) mod 7其中,DD为日期数。
mod表示取模运算。
通过以上的计算过程,我们可以快速准确地确定任意日期是星期几。
需要注意的是,蔡勒公式的计算结果中,0代表星期日,1代表星期一,以此类推,6代表星期六。
蔡勒公式是一种简单易用的计算星期几的公式,它的推导过程基于数学方法,通过一系列简单的计算,可以快速准确地确定任意日期是星期几。
在日历、时间和天文学等领域得到了广泛的应用。
万年历公立计算方法

元旦到5月1日经过的天数。第二段比较好算,它等于21*365+5=7670天,之所以要加
5,是因为这段时间内有5个闰年。第一段和第三段就比较麻烦了,比如第三段,需要把
5月之前的四个月的天数累加起来,再加上日期值,即31+29+31+30+1=122天。同理,第
的差值,余数就表示想算的日子的星期在确定的日子的星期之后多少天。如果余数是
0,就表示这两天的星期相同。显然,如果把这个作为“原点”的日子选为星期日,那
么余数正好就等于星期几,这样计算就更方便了。
但是直接计算两天之间的天数,还是不免繁琐。比如1982年7月29日和2004年5月
1日之间相隔7947天,就不是一下子能算出来的。它包括三段时间:一,1982年7月29
公式变成:
W = (Y-1) + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + [ 13 * (M+1) / 5 ] + d.
=49+[12.25]+5-40+[28.6]
=49+12+5-40+28
=54 (除以7余5)
即2049年10月1日(100周年国庆)是星期5。
你的生日(出生时、今年、明年)是星期几?不妨试一试。
不过,以上公式只适合于1582年10月15日之后的情形(当时的罗马教皇将恺撒大帝制订的儒略历修改成格里历,即今天使用的公历)。
公式中的符号含义如下,w:星期;c:世纪-1;y:年(两位数);m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算);d:日;[ ]代表取整,即只要整数部分。(C是世纪数减一,y是年份后两位,M是月份,d是日数。1月和2月要按上一年的13月和 14月来算,这时C和y均按上一年取值。)
zeller公式

zeller公式
Zeller公式是一种计算某一日期是星期几的方法。
它是由德国数学家克里斯蒂安·祖勒发明的,可以在不使用计算机的情况下快速计算出任意一天是星期几。
该公式的历史可以追溯到1800年前后,当时的祖勒发现了一些特殊的规律,从而推导出了这个公式。
Zeller公式的原理是基于蔡勒公式而来的。
蔡勒公式是计算公元年到某一年某一天是星期几的方法。
但是,蔡勒公式需要进行大量的乘法和加法运算,计算量相对较大。
而Zeller公式则采用了不同的算法,计算量相对较小。
Zeller公式的具体计算方法如下:
W = [C/4] - 2C + y + [y/4] + [13(m+1)/5] + d - 1
其中,W表示星期几,C表示世纪数,y表示该年份的后两位数字,m表示月份,d表示日期。
方括号表示向下取整。
需要注意的是,月份需要进行一些特殊处理,即1月和2月分别算作上一年的13月和14月,公式中的m要加上12,即W=[C/4]-2C+y+[y/4]+[13(m+1)/5]+d-1。
Zeller公式的计算过程并不复杂,但是需要进行多次计算,因此需要仔细地核对计算结果。
如果出现计算错误,可能会导致最终的结果出现偏差。
因此,在使用Zeller公式进行计算时,需要认真对待
每一个步骤,确保计算结果的准确性。
Zeller公式是一种非常实用的计算方法,可以方便地计算出任意一天是星期几。
虽然现在计算机已经普及,但是学习Zeller公式仍然具有很高的实用价值。
蔡勒(Zeller)公式及其推导:快速将任意日期转换为星期数

蔡勒(Zeller)公式及其推导:快速将任意⽇期转换为星期数0. 本⽂的初衷及蔡勒公式的⽤处前⼀段时间,我在准备北邮计算机考研复试的时候,做了⼏道与⽇期计算相关的题⽬,在这个过程中我接触到了蔡勒公式。
先简单的介绍⼀下蔡勒公式是⼲什么⽤的。
我们有时候会遇到这样的问题:看到⼀个⽇期想知道这⼀天是星期⼏,甚⾄看到⼀个历史⽇期或纪念⽇,我们想快速的知道这⼀天是星期⼏。
对于这个问题,如果⽤编程的⽅式,应该怎么实现呢?你可能已经有思路了,⽐如你知道某个⽇期是星期⼏,把这个⽇期作为原点,然后计算⽬标⽇期和这个原点之间相差多少天,再除以7 求余数,最后通过余数判断⽬标⽇期的星期数。
通过这样的过程,你确实可以得到正确的结果,但这不够快速也不够优雅。
对于这个问题,如果你懂得蔡勒公式,那就变得异常简单了,你只需要将年⽉⽇等数据代⼊公式,然后计算出结果,这⼀结果就是⽬标⽇期对应的星期数。
当我知道蔡勒公式之后,我觉得它⾮常有趣也很酷,所以我不仅希望掌握公式的使⽤,也希望可以掌握公式背后的推导过程。
然⽽,当我在⽹上搜索相关的⽂章时,我发现⼏乎所有向我展⽰的博客(从零⼏年到最近的 19 年)⼤多是转载、复制于这篇⽂章():星期制度是⼀种有古⽼传统的制度。
据说因为《圣经·创世纪》中规定上帝⽤了六天时间创世纪,第七天休息,所以⼈们也就以七天为⼀个周期来安排⾃⼰的⼯作和⽣活,⽽星期⽇是休息⽇……这篇⽂章质量很不错,讲解过程⾃然流畅,但是在⼀些细节上存在错误,有些推导步骤让⼈感到困惑。
因此,当我掌握蔡勒公式后,很希望可以将我的理解输出出来,让想要学习蔡勒公式推导过程的⼈看到⼀些新的材料。
好了,废话少说,我们开始吧。
1. 蔡勒公式的形式如果你对公式的推导过程不感兴趣,只是希望使⽤蔡勒公式,那么只看此⼩节即可。
蔡勒公式的形式如下:\[\begin{aligned} D &= \left[ \frac{c}{4} \right] - 2c + y + \left[ \frac{y}{4} \right] + \left[ \frac{13(m+1)}{5} \right] + d - 1 \\[2ex] W &= D \bmod 7 \end{aligned} \]其中:W 是星期数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
program clgs; var a,b,c,d,x,y:longint; begin readln(a,b,d); if b<3 then begin b:=b+12; a:=a-1; end; y:=a mod 100; c:=a div 100; x:=y+trunc(y/4)+trunc(c/4)-2*c+trunc(13*(b+1)/5+d-1); while x<=7 do x:=x+7; writeln((x-1)mod 7+1); readln; readln; end.
蔡勒公式
蔡勒(Zeller)公式,是一个计算星期的公式,随便给一个日期,就能用这个公 式推算出是星期几。
公式
W = [C/4] - 2C + y + [y/4] + [13 * (M+1) / 5] + d - 1 (或:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1) 若要计算的日期是在 1582 年 10 月 4 日或之前,公式则为 w=y+[y/4]+[c/4]-2c+[13(m+1)/5]+d+3
其他公式
对于计算星期数的公式还有如下的公式: 1.Week=(Day + 2*Month + 3*(Month+1)/5 + Year + Year/4 - Year/100 + Year/400) % 7 (其中的 Year 是四位数,如 2011。“%”号是等式除 7 取余数) 该式与蔡勒公式有点区别:“0”为星期 1,……,“6”为星期日! 该式可能与蔡勒公式的计算都是较为复杂,但有改进的地方:对于世纪 这个概念不被引用,直接就是计算年代数(4 位数)的,即不用再把 世纪 和 年代数(后两位)分开。 2.基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在公式中 d 表示日 期中的日数+1,m 表示月份数,y 表示年数。 注意:在公式中有个与其他公式不同的地方: 把一月和二月看成是上一年的十三月和十四月, 例:如果是 2011-1-10 则换算成:2010-13-10 来代入公式计算。 例:2011-10-17 计算时:d=18,m=10,y=2011。 Java 代码: string CaculateWeekDay(int y,int m, int d) { if(m==1) m=13; if(m==2) m=14; int week=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; string weekstr=""; switch(week) { case 1: weekstr="星期一"; break; case 2: weekstr="星期二"; break; case 3: weekstr="星期三"; break; case 4: weekstr="星期四"; break; case 5: weekstr="星期五"; break;
case 6: weekstr="星期六"; break; case 7: weekstr="星期日"; break; } return weekstr; } 3.(Year+Year/4+Year/400-Year/100-年基数+月基数+Day)/7=……余 Week(星期几)。【注:式中分数均取整。】 年基数:平年 1,闰年 2, 月基数: 1、平年:一月 0, 二月 3, 三月 3, 四月 6, 五月 1, 六月 4, 七月 0, 八 月 3, 九月 5, 十月 0, 十一月 3, 十二月 5. 2、闰年:一月 0, 二月 3, 三月 4, 四月 0, 五月 2, 六月 5, 七月 0, 八 月 3, 九月 6, 十月 1, 十一月 4, 十二月 6. 如:1949 年 10 月 1 日是星期几? (1949+1949/4+1949/400-1949/100-1+0+1)/7=(1949+487+4-19-1+0+1) /7=345……6 即该日为星期六。 所谓月基数,就是前几个月日数总和的 7 余数,如 1 月基数,前面月数 的日数总和的 7 余数为 0,则该月的基数就是 0,如 4 月(闰年)基数,前面 三个月的日数总和为:(31+29+31)/7=91/7……0 为了简化运算,先取各 月 7 余数,再相加,再取 7 余数:(3+1+3)/7……0,即 4 月基数为 0,为 了加快计算速度,通常是将平年和闰年的月基数编成基数表,直接查算。 月 基数,1、平年:一月 0, 二月 3, 三月 3, 四月 6, 五月 1, 六月 4, 七月 0, 八月 3, 九月 5, 十月 0, 十一月 3, 十二月 5. 2、闰年:一月 0, 二月 3, 三 月 4, 四月 0, 五月 2, 六月 5, 七月 0, 八月 3, 九月 6, 十月 1, 十一月 4, 十二月 6.
后来人们将这一新的历法称为“格里高利历”,也就是今天世界上所通 用的历法,简称格里历或公历。
计算代码
1582 年 10 月 4 日之后的计算代码如下:
c 代码: #include <stdio.h> int main() { int year,month,day; while(scanf("%d%d%d",&year,&month,&day)!=EOF){ int i,j,k; int c=year/100; int y=year-c*100; int week=int(c/4)-2*c+int(y+y/4)+int(13*(month+1)/5)+day-1; while(week<0) { week+=7; } week%=7; switch(week) { case 1: printf("Monday\n"); break; case 2: printf("Tuesday\n"); break; case 3: printf("Wednesday\n"); break; case 4: printf("Thursday\n"); break; case 5: printf("Friday\n"); break; case 6: printf("Saturday\n"); break; case 0: printf("Sunday\n"); break; } } return 0; } C++代码: #include <iostream> using namespace std; int main(){ int year,month,day; while(cin >> year >> month >> day){ if ( month < 3 ) { year -= 1; month += 12; } char b[7][10] = {"sunday","monday","tuesday","wednesday","thursday","friday","sat urday"}; int c = int(year / 100), y = year - 100 * c; int w = int(c / 4) - 2*c +y +int(y/4) +(26 * (month + 1)/10 ) + day - 1; w = ( w % 7 + 7 ) % 7; cout << b[w] << endl; Pascal 代码:
其中意义: w:星期; w 对 7 取得:0-星期日,1-星期一,2-星期二, 3-星期三,4-星期四,5-星期五,6-星期六
c:世纪(前两位数) y:年(后两位数) m:月(m 大于等于 3,小于等于 14,即在蔡勒公式中,某年的 1、2 月 要看作上一年的 13、14 月来计算,比如 2011 年 1 月 1 日要看作 2010 年的 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,注意对负数的取模运算!)