计算星期的算法
给出年月日,计算星期几--算法及算法来历
= 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太大了。其实,
给出年月日计算星期几
【转】给出年月日,计算星期几--算法及算法来历最常见的公式: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,则为星期日。
---------------------------------------------------------------------------星期制度是一种有古老传统的制度。
据说因为《圣经·创世纪》中规定上帝用了六天时间创世纪,第七天休息,所以人们也就以七天为一个周期来安排自己的工作和生活,而星期日是休息日。
从实际的角度来讲,以七天为一个周期,长短也比较合适。
所以尽管中国的传统工作周期是十天(比如王勃《滕王阁序》中说的“十旬休暇”,即是指官员的工作每十日为一个周期,第十日休假),但后来也采取了西方的星期制度。
在日常生活中,我们常常遇到要知道某一天是星期几的问题。
有时候,我们还想知道历史上某一天是星期几。
通常,解决这个方法的有效办法是看日历,但是我们总不会随时随身带着日历,更不可能随时随身带着几千年的万年历。
假如是想在计算机编程中计算某一天是星期几,预先把一本万年历存进去就更不现实了。
计算星期程序
输入0退出,其他继续:d
2008,1,1
星期二
输入0退出,其他继续:l
2008,8,8
星期五
输入0退出,其他继续:0
请按任意键继续. . .
注:用来算现在真实日期的星期是没有问题的。原理是根据已知公元1年1月1日的星期数来推算。如果在你的题目中约定了某天是星期几,你要注意那天的星期是否跟真实的星期相同,如果不同,需要考虑相差几天!
由于我们要计算的是当前要计算的年之前的闰年数,所以要将年减1,得到了如下的公式:
w = [d-1+y + (y-1)/4-(y-1)/100+(y-1)/400] % 7 -----公式⑵
现在,我们得到了按年扩展的公式⑵,用这个公式可以计算任一年的1月份的星期
四、扩展到其它月
考虑这个问题颇费了一翻脑筋,后来还是按前面的方法大胆假才找到突破口。
#include <stdio.h>
void CaculateWeekday(int y, int m, int d)
{
int w; //代表星期几
if (m==1 || m==2)
{
m += 12;
y--;
}
w = (d+1 + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400)%7;
flushall();
printf("按 Esc 键退出,其他键继续!");
ch = getch();
printf("\n");
flushall();
周数计算
FIRST_DAY LAST_DAY
--------- ---------
25-APR-05 01-MAY-05
Elapsed: 00:00:00.00
127.0.0.1:asdb:WF>
-- 验证如下
127.0.0.1:asdb:WF>select to_char(to_date('20050424','yyyymmdd'),'iw') as weekn,to_char(to_date('20050425','yyyymmdd'),'iw') as week1,to_char(to_date('20050501','yyyymmdd'),'iw') as week2,to_char(to_date('20050502','yyyymmdd'),'iw') as weekn2 from dual;
=================================================================================
(责任编辑:卢兆林)
详细讲解"Oracle"数据库的“周数计算”
赛迪网-IT技术报道】--日期计算,算第n周的第一天及最后一天是几号。 by keynes 2005.04.29
================================================
-- ww的算法为每年1月1日为第一周开始,date+6为每一周结尾
星期的计算
星期的计算是以数学方法计算出某一指定日期是在一周中的哪一天。
多种数学算法可计算出过去或未来某一指定日期,是属于一周中的星期几,包括判决日法则(Doomsday Rule),Babwani公式等,但其实这些算法皆基于类似的机制相互变化而来,只是透过不同规则取得相同结果。
算法的典型应用,是计算某人的出生日期或某重大事件的发生日期,是在一周中的哪一天。
目录[隐藏]1 简介1.1 最简单的方法一1.2 最简单的方法二2 有用的概念2.1 同周月2.2 同周年3 算法3.1 例子3.2 世纪星期表3.3 年份星期表3.4 月份星期表3.5 日期星期表4 表格法5 心算法5.1 判决日5.2 年数的计算5.3 例子6 高斯公式6.1 例子7 Babwani公式8 蔡勒公式9 主日字母10 参见[编辑]简介差不多所有星期算法的基础皆可归纳如下:从一个已知的日子作为起始日,一般采用世纪的第一天,通过同余7计算共过去了多少天。
如将一周日子由0至6计算,结果将为一余数,如使用1至7计算,则7将代替0。
查表或使用已知规则计算上面的起始日,即该世纪开始的星期数。
查表或使用已知规则计算该年份开始的星期数。
计算该月份开始的星期数。
从该月份开始的计算该日的星期数。
简单来说,使用同余7表示在计算中可剔除7的倍数,如此可把7当作0、8当作1、9当作2、18当作4,如此类推。
如果把星期日当作第0日,7日后(第7日)亦是星期日,而第18日则会与第4日相同,为星期日后的4天,即星期四。
一些算法把所有加数先行计算,然后把7的倍数剔除,而其他算法则在每一步皆剔除7的倍数。
两种做法皆可取,第一种做法较适用于计算机及电脑算法中,其他则较适用于心算。
这些计算在熟习后,可在脑内计算出来。
[编辑]最简单的方法一把四个数加起来然后除七的余数就是,如果整除就是星期日。
这四个数分别是:Y(year):年份减2000L(leap days):从2000年1月1日到该日之间的闰日数目M(month):月份的代号,从一月到十二月分别是511462403513,即是一月是5,二、三月是1,四月是4,五月是6,如此类推,十二月是3就是说——Y+L+M+D(除7的余数)举例说:2008年12月10日(8+3+3+10)除7余3,即该日是星期三,其中Y=8、L=3(三个闰日分别是2000年2月29日、2004年2月29日和2008年2月29日)、M=3(12月的代号是3)、D=10再举一例:2008年2月10日(8+2+1+10)除7余0,即该日是星期日,其中Y=8、L=2(从2000年1月1日到2008年2月10日之间只有二个闰日:2000年2月29日和2004年2月29日)、M=1(2月的代号是1)、D=10此公式的原理365除七余一,所以每过一个平年,星期数便加一。
万年历的算法
摘自: 星期、干支、二十八宿计算公式打印本页关闭本窗口1. 求星期公式星期=[5+A(实际天数)] mod 72. 干支计算公式六十甲子干支序号,从1->59->0。
六十甲子干支序号=[23+A(实际天数)] mod 603. 二十八宿计算公式二十八宿序号=[23+A(实际天数)] mod 284. 实际天数A的计算A=B(基本天数)+C(闰日天数)B=(计算年-1)*365+(要计算到年的月日天数)例:1984年2月1日的基本天数B=(1984-1)*365+(31+1)=723827(天),其中,31是1月为31天,1为2月1日为1天。
公元308年8月28日的基本天数B=(308-1)*365+(31+28+31+30+31+30+31+27)=112055+239=112294(天)这里的(要计算到年的月日天数),用的是公历,月日天数的规则我好象小学就学过了。
哈哈……C=(计算年-1) div 4 -误差修正值+ fixValue2fixValue2为0或者1。
常值为0,当年数为闰年(公历闰年法)之中的3月1日之后的为1。
误差修正值推算:公元元年1月1日至1582年10月14日为0。
1582年10月15日至1699年12月31日为10。
从1701年1月1日起每增加一个世纪累加1,但能被400除尽的世纪不累加1。
此方法推算即可。
--有一个问题,1700年这一年的修正值应为多少呢?算法中正好没有讲到,但看来应该是10。
例1701年1月1日起误差值为11,而1801年1月1日起误差修正值为12,而1901年1月1日起误差修正值为13,但2001年误差修正值仍为13,因为2000年能被400整除,故不累加。
而2101年1月1日起误差修正值为14。
5. 实例:1998.3.15的星期、干支与二十八宿B=(1998-1)*365+(31+28+15)=728979C=(1998-1) div 4 - 13 + 0 = 486A=B+C=728979+486=729465星期序号=(5+729465) mod 7=0,即为星期日干支序号=(13+729465) mod 60=58,即为辛酉二十八宿序号=(23+729465) mod 28=4,即为房===================================================好可怕!还有一些其它公式……但好象有些参数不知道怎么得到:二十四节交节日算法:用已知年的交接时辰加上22个小时35分,超过24要减去24,分数足60 进1个小时,即得到8年后的各节交节时辰。
C语言根据日期判断星期几(使用基姆拉尔森计算公式)
C语言根据日期判断星期几(使用基姆拉尔森计算公式)算法如下:基姆拉尔森计算公式W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7在公式中d表示日期中的日数,m表示月份数,y表示年数。
注意:在公式中有个与其他公式不同的地方:把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2 003-13-10来代入公式计算。
以公元元年为参考,公元元年1月1日为星期一</PRE><PRE>程序如下:#include "stdio.h"void CaculateWeekDay(int y,int m, int d){if(m==1||m==2) {m+=12;y--;}int iWeek=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;switch(iWeek){case 0: printf("星期一\n"); break;case 1: printf("星期二\n"); break;case 2: printf("星期三\n"); break;case 3: printf("星期四\n"); break;case 4: printf("星期五\n"); break;case 5: printf("星期六\n"); break;case 6: printf("星期日\n"); break;}}void main(){int year=0,month=0,day=0;printf("请输入日期:\n格式为:1900,1,1\n");char temp = '1';while (temp != '0'){scanf("%d,%d,%d",&year,&month,&day);scanf("%c",&temp);CaculateWeekDay(year,month,day);printf("输入0退出,其他继续:");scanf("%c",&temp);}}运行效果:请输入日期:格式为:1900,1,12008,4,29星期二输入0退出,其他继续:d2008,1,1星期二输入0退出,其他继续:l2008,8,8星期五输入0退出,其他继续:0请按任意键继续. . .编者注:用来算现在真实日期的星期是没有问题的。
四种周几推算法
四种周几(星期几)推算法孙致平编辑一、周数法(主要用周数推算,最易理解的法)举例说明。
题:算2019年10月1日周几。
解:该日公元总天数=》离该日当年且小于当年的闰年数/4*1461+平年数*365+零天数=》2016/4*1461+2*365+273=》737347, 737347/7=》105335周(星期)余2天(737347-105335*7=2)。
答:该日是周二。
二、代码法(主要用月代码推算,适合推算近期的)公式:(日期数+月代码)/4,余几(余0表示周日)就是周几。
月代码:某月最后一天是周几,就是其下月的代码。
例如,2018年12月31日是周一,那么,2019年1月的代码就是1。
例题:算2019年1月31日周几。
解:因为该1月的代码是1,所以,(31+1)/7)=>余4。
答:该日周四。
很容易就推出一年12个月的代码(2019年是144725736146),把它记住了,很快就可算出该年某日是周几。
三、三码法(主要用年月日三码推算,适用年份有限)适用2000年至2099年公式:(日码+月码+年码)/7=》余几,余几就是周几,余0就是周日。
适用1901年至1999年公式:(日码+月码+年码)/7=》余几+1,余几+1的和就是周几,其和是0就是周日。
日码:需要推算的日期数。
月码:闰年512503514624,平年622503514624。
年码:(年后两位/4+年后两位)/7=》余数(年码)。
注:(年后两位)/4取整,后两位数小于4取0。
例1、2000年3月25日周几?解:年码=》(0/4+0)/7=》余0。
故(25+2+0)/7=》余6。
答:该日周六。
例2、2020年2月29日周几?解:年码=》(20/4+20)/7=》余4。
故(29+1+4)/7=》余6。
答:该日周六。
例3、1903年4月27日周几?解:年码=》(3/4+3)/7=》余3。
故(27+5+3)/7=》余0+1=1。
答:该日周一。
计算星期几的方法
计算星期几的方法计算任何一个日期是星期几的方法蔡勒公式W = [C/4] - 2C + y + [y/4] + [13×(M+1) / 5] + d - 1 C是世纪数减1,y是年份后两位,M是月份(从3月开始,1月和2月要按上一年的13月和14月来算,这时C和y 均按上一年取值),d是日数。
求出W的值,再除以7,余几就是星期几,余数为0,则是星期天。
注意:[...]表示只取整数部分注意:公式中如计算得出负数,不能按习惯的余数的概念求余数,只能按数论中的余数的定义求余。
为了方便计算,我们可以给它加上一个7的整数倍,使它变为一个正数,比如加上7、14、21、28等,得到一个整数后,再除以7,余几,说明这一天是星期几。
例1:2004年的9月1日是星期几?C=20 y=04 M=9 d=1W = [C/4] - 2C + y + [y/4] + [13×(M+1) / 5] + d - 1 =[20/4]-2×20+04+[04/4]+[13×(9+1)/5]+1-1=5-40+4+1+[13×2]+1-1=5-40+4+1+26+1-1=-4W为负数不行,加7的倍数14,得10。
10除以7,余数为3,2004年的9月1日是星期三。
例2:2010年的7月15日是星期几?C=20 y=10 M=7 d=15W = [C/4] - 2C + y + [y/4] + [13×(M+1) / 5] + d - 1 =[20/4]-2×20+10+[10/4]+[13×(7+1)/5]+15-1=5-40+10+2+[13×8/5]+14=-23+20+14=1111除以7余数为4,2010年的7月15日是星期四。
链接:1世纪为100年,2000年以后为21世纪,以此类推1个年代为10年,90-99为90年代,以此类推!如:1900年是19世纪、1901年是20世纪、2000年是20世纪、2001年是21世纪。
日期求星期的算法及闰年来历
日期算法/*星期计算公式(年+年/4+年/400-年/100-年基数+月基数+日)/7=……余星期几注:式中分数均取整年基数:平年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)即该日为星期六。
增加几个函数,用于计算星期*/闰年的判断方法:整百的年份,能被4整除但不能被400整除的,不是闰年。
也就是说2000年是闰年,1900年、2100年等不是闰年。
地球绕太阳运行周期为365天5小时48分46秒(合365.24219天)即一回归年(tropical year)。
公历的平年只有365日,比回归年短约0.2422 日,所余下的时间约为四年累计一天,故四年于2月加1天,使当年的历年长度为366日,这一年就为闰年。
现行公历中每400年有97个闰年。
按照每四年一个闰年计算,平均每年就要多算出0.0078天,这样经过四百年就会多算出大约3天来,因此,每四百年中要减少三个闰年。
所以规定,公历年份是整百数的,必须是400的倍数的才是闰年,不是400的倍数的,虽然是4的倍数,也是平年,这就是通常所说的:四年一闰,百年不闰,四百年再闰。
例如,2000年是闰年,1900年则是平年。
整百的年份,能被4整除但不能被400整除的,不是闰年。
也就是说2000年是闰年,1900年、2100年等不是闰年。
地球绕太阳运行周期为365天5小时48分46秒(合365.24219天)即一回归年(tropical year)。
公历的平年只有365日,比回归年短约0.2422 日,所余下的时间约为四年累计一天,故四年于2月加1天,使当年的历年长度为366日,这一年就为闰年。
C语言根据日期判断星期几(使用基姆拉尔森计算公式)加解释
C语言根据日期判断星期几(使用基姆拉尔森计算公式)算法如下:基姆拉尔森计算公式W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7在公式中d表示日期中的日数,m表示月份数,y表示年数。
注意:在公式中有个与其他公式不同的地方:把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。
以公元元年为参考,公元元年1月1日为星期一</PRE><PRE>程序如下:/*利用基姆拉尔森计算日期公式w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)*/#include <stdio.h>void CaculateWeekday(int y, int m, int d){int w; //代表星期几if (m==1 || m==2){m += 12;y--;}w = (d+1 + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400)%7;switch(w){case 0:printf("星期天!\n"); break;case 1:printf("星期一\n"); break;case 2:printf("星期二\n"); break;case 3:printf("星期三\n"); break;case 4:printf("星期四\n"); break;case 5:printf("星期五\n"); break;case 6:printf("星期六\n"); break;}}int main(){int year,month,day;char ch='1';while(ch != '\033'){printf("\n请输入日期:\n格式为:1900,1,1\n"); scanf("%d,%d,%d",&year,&month,&day); CaculateWeekday(year,month,day);flushall();printf("按Esc 键退出,其他键继续!");ch = getch();printf("\n");flushall();}}运行效果:请输入日期:格式为:1900,1,12008,4,29星期二输入0退出,其他继续:d2008,1,1星期二输入0退出,其他继续:l2008,8,8星期五输入0退出,其他继续:0请按任意键继续. . .编者注:用来算现在真实日期的星期是没有问题的。
C语言根据日期判断星期几使用基姆拉尔森计算公式
C语言根据日期判断星期几(使用基姆拉尔森计算公式)算法如下:基姆拉尔森计算公式W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7在公式中d表示日期中的日数,m表示月份数,y表示年数。
注意:在公式中有个与其他公式不同的地方:把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。
以公元元年为参考,公元元年1月1日为星期一;;程序如下:#include "stdio.h"void CaculateWeekDay(int y,int m, int d){if(m==1||m==2) {m+=12;y--;}intiWeek=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;switch(iWeek){case 0: printf("星期一\n"); break; case 1: printf("星期二\n"); break; case 2: printf("星期三\n"); break; case 3: printf("星期四\n"); break; case 4: printf("星期五\n"); break; case 5: printf("星期六\n"); break; case 6: printf("星期日\n"); break; }}void main(){int year=0,month=0,day=0;printf("请输入日期:\n格式为:1900,1,1\n");char temp = '1';while (temp != '0')scanf("%d,%d,%d",&year,&month,& amp;day);scanf("%c",&temp);CaculateWeekDay(year,month,day);printf("输入0退出,其他继续:");scanf("%c",&temp);}}运行效果:请输入日期:格式为:1900,1,12008,4,29星期二输入0退出,其他继续:d2008,1,1输入0退出,其他继续:l2008,8,8星期五输入0退出,其他继续:0请按任意键继续. . .编者注:用来算现在真实日期的星期是没有问题的。
判断某一天是星期几的算法
最后写一个很有用的星期的介绍如何计算某一天是星期几?——蔡勒(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日之后的情形(当时的罗马教皇将恺撒大帝制订的儒略历修改成格里历,即今天使用的公历)。
过程的推导:(对推理不感兴趣的可略过不看)星期制度是一种有古老传统的制度。
据说因为《圣经·创世纪》中规定上帝用了六天时间创世纪,第七天休息,所以人们也就以七天为一个周期来安排自己的工作和生活,而星期日是休息日。
从实际的角度来讲,以七天为一个周期,长短也比较合适。
用闰年的规则来推算星期几
由闰年的规则来推算星期几的算法默认分类2009-07-25 14:36:43 阅读233 评论0 字号:大中小订阅地球绕日运行周期=365天5小时48分46秒(合365.24219天),即一回归年(tropical year)如果一年就只有365天。
每年多出5小时48分46秒,那么,每4年就多出23小时15分4秒约等于1天(24小时)1,于是每隔4年增加1天为闰年,加载在2月中。
当年为2月有29日2,但这样一来又有个问题,如果是每隔4年增加1天的话,24小时-23小时15分4秒=44分56秒过了100年累计少了25*44分56秒=1100分1400秒=18小时43分20秒差不多少了一天3,可以计算每年多出5小时48分46秒,100年多出581小时16分40秒。
而25个闰年需要25*24=600小时 581小时16分40秒只够24个闰年(24*24=576小时),于是决定100年安排24个闰年(世纪年不是闰年)。
但是这样每100年又多出581小时16分40秒 -576小时=5小时16分40秒,于是每隔400年再增加一天(即为闰年),就比较合适4*5小时16分40秒=20小时64分160秒=21小时6分40秒约一天。
实际还可以考虑 24小时-21小时6分40秒=2小时53分20秒 3200年就少了23小时6分40秒差不多又是一天。
怎么办?按 5小时48分45.5秒(精确)计算3200年多出16000小时153600分145600秒 =18600小时26分40秒里面共32*24+8=136个闰年=776*24=18624小时这就不行了那么就算是775个闰年,就是不算3200年为闰年,于是775*24=18600,那么多出了的26分40秒怎么办需要多少个周期弥补?答案是54个周期,为172800年,请看172800/3200=54个周期 54*26分40秒=1404分2160秒=24小时!多么神奇!!!!!!!!网上又有另外的计算,是不精确的计算,是差0.5秒的结果,请看:现在我们通用的阳历,制历之年取的是“回归年”,也就是一年按365天5h48'46''计算,一年日数必须是整数,不便将零时数计入,所以取365天为一年,则余5时48分46秒,积至4年约满一日,所以4年一“闰日”,谓之“闰年”,无“闰日”之年为平年,即平年365天,闰年366天。
给出年月日计算星期几
= 122,
这正是5月1日在2004年的累积天数。
假如,我们再变通一下,把1月和2月当成是上一年的“13月”和“14月”,不仅仍然符合这个公式,而且因为这样一来,闰日成了上一“年”(一共有14个月)的最后一天,成了d的一部分,于是平闰年的影响也去掉了,公式就简化成:
= 2002 + 500 - 20 + 5 + 36 + 1
= 2524;
2524 / 7 = 360……4.这和实际是一致的。
公式(5)已经是从年、月、日来算星期几的公式了,但它还不是最简练的,对于年份的处理还有改进的方法。我们先来用这个公式算出每个世纪第一年3月1日的星期,列表如下:
年份: 1(401,801,…,2001) 101(501,901,…,2101)
显然,W这么大的原因是因为公式中的第一项(Y-1)*365太大了。其实,
(Y-1)*365 = (Y-1) * (364+1)
= (Y-1) * (7*52+1)
= 52 * (Y-1) * 7 + (Y-1),
这个结果的第一项是一个7的倍数,除以7余数为0,因此(Y-1)*365除以7的余数其实就等于Y-1除以7的余数。这个关系可以表示为:
【转】给出年月日,计算星期几--算法及算法来历最常见的公式:
W = [Y-1] + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D
Y是年份数,D是这一天在这一年中的累积天数,也就是这一天在这一年中是第几天。
生活数学算法(星期、属相、纪年、身份证)
生活数学算法(星期、属相、纪年、身份证)目录1、每年第一天星期公式 22、几月几日是星期几的算法 33、天干地支纪年及属相计算法 44、身份证号码编码规则及校验位校验算法 51、每年第一天星期公式:[5(1)/4(1)/100(1)/400]%71w year year year =---+-+其中 w 表示星期,w=0,1,2,3,4,5,6表示w=星期日、一、二、三、四、五、六 year 表示年份,“/”表示整除,“%”表示求余数。
证明:因为 1回归年为365.2422日,所以四年大概有一闰年。
闰年的规定:凡是年份能够被4整除、且不能被100整除的是闰年;凡是年份能被400整除的也是闰年;除此以外的年份都不是闰年。
闰年366天,平年365天。
公元1年第一天(星期一),做为起始天,只要用“这天与起始天之差”,与7求余数,当余数为0,则这天与起始天星期相同,也就是星期一;否则,这个余数+1就是这天的星期几。
假如没有闰年一说那么 year 年的第一天之前有多少天呢? (year-1)365总结一下公式变成了 w=(year-1)365%7+1 闰年的数量为(year-1)/4-(year-1)/100+(year-1)/400在原有的基础上加上闰年的数量后,求星期的公式变为 w=[(year-1)365+(year-1)/4-(year-1)/100+(year-1)/400]%7+1 对公式进行优化一下 365=364+1(year-1)365=(year-1)*364+(year-1)364/7=52 我们要求余所以前面364那部分可以直接扔了。
公式变为w=[5(year-1)/4-(year-1)/100+(year-1)/400]%7+1知道了某年第一天星期几的话,后面的月份就可以根据累加计算出来的 例 2021年元旦是星期几year-1=2021-1=2020w=(5*2020/4-2020/100+2020/400)%7+1=(2525-20+5)%7+1=2510%7+1=4+1=52021年元旦是星期五2、几月几日是星期几的算法月份补数:(日期+月份补数)%7=星期比如:2021年元旦是星期五,1号与五相差4,所以4是1月份补数。
用闰年的规则来推算星期几
由闰年的规则来推算星期几的算法默认分类2009-07-25 14:36:43 阅读233 评论0 字号:大中小订阅地球绕日运行周期=365天5小时48分46秒(合365.24219天),即一回归年(tropical year)如果一年就只有365天。
每年多出5小时48分46秒,那么,每4年就多出23小时15分4秒约等于1天(24小时)1,于是每隔4年增加1天为闰年,加载在2月中。
当年为2月有29日2,但这样一来又有个问题,如果是每隔4年增加1天的话,24小时-23小时15分4秒=44分56秒过了100年累计少了25*44分56秒=1100分1400秒=18小时43分20秒差不多少了一天3,可以计算每年多出5小时48分46秒,100年多出581小时16分40秒。
而25个闰年需要25*24=600小时 581小时16分40秒只够24个闰年(24*24=576小时),于是决定100年安排24个闰年(世纪年不是闰年)。
但是这样每100年又多出581小时16分40秒 -576小时=5小时16分40秒,于是每隔400年再增加一天(即为闰年),就比较合适4*5小时16分40秒=20小时64分160秒=21小时6分40秒约一天。
实际还可以考虑 24小时-21小时6分40秒=2小时53分20秒 3200年就少了23小时6分40秒差不多又是一天。
怎么办?按 5小时48分45.5秒(精确)计算3200年多出16000小时153600分145600秒 =18600小时26分40秒里面共32*24+8=136个闰年=776*24=18624小时这就不行了那么就算是775个闰年,就是不算3200年为闰年,于是775*24=18600,那么多出了的26分40秒怎么办需要多少个周期弥补?答案是54个周期,为172800年,请看172800/3200=54个周期 54*26分40秒=1404分2160秒=24小时!多么神奇!!!!!!!!网上又有另外的计算,是不精确的计算,是差0.5秒的结果,请看:现在我们通用的阳历,制历之年取的是“回归年”,也就是一年按365天5h48'46''计算,一年日数必须是整数,不便将零时数计入,所以取365天为一年,则余5时48分46秒,积至4年约满一日,所以4年一“闰日”,谓之“闰年”,无“闰日”之年为平年,即平年365天,闰年366天。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算任何一天是星期几的几种算法
近日在论坛上看到有人在问星期算法,特别整理了一下,这些算法都是从网上搜索而来,算法的实现是我在项目中写的。
希望对大家有所帮助。
一:常用公式
W = [Y-1] + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D
Y是年份数,D是这一天在这一年中的累积天数,也就是这一天在这一年中是第几天。
二:蔡勒(Zeller)公式
w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
公式中的符号含义如下,w:星期;c:世纪;y:年(两位数);m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算);d:日;[ ]代表取整,即只要整数部分。
相比于通用计算公式而言,蔡勒(Zeller)公式大大降低了计算的复杂度。
三:对蔡勒(Zeller)公式的改进
作者:冯思琮
相比于另外一个通用计算公式而言,蔡勒(Zeller)公式大大降低了计算的复杂度。
不过,笔者给出的通用计算公式似乎更加简洁(包括运算过程)。
现将公式列于其下:
W=[y/4]+r (y/7)-2r(c/4)+m’+d
公式中的符号含义如下,r ( )代表取余,即只要余数部分;m’是m的修正数,现给出1至12月的修正数1’至12’如下:(1’,10’)=6;(2’,3’,11’)=2;(4’,7’)=5;5’=0;6’=3;8’=1;(9’,12’)=4(注意:在笔者给出的公式中,y为润年时1’=5;2’=1)。
其他符号与蔡勒(Zeller)公式中的含义相同。
四:基姆拉尔森计算公式
这个公式名称是我给命名的,哈哈希望大家不要见怪。
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
在公式中d表示日期中的日数,m表示月份数,y表示年数。
注意:在公式中有个与其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。