给定年月日,一个公式巧算星期几

来看公式:

int 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;
  	return iWeek;
} 

这个公式叫基姆拉尔森公式。

该公式是从公元0年1月1日开始推导的

刚看挺复杂,我逐一分析:

iWeek=   (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) %7

1.

(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) %7

d表示天数,天数对7取模,这个好理解

2.

(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) %7

不考虑瑞年,则每天为   365   天。由于365是7的52倍多1天,所有加上y

3.

(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) %7

如果考虑闰年,由于闰年比平年多一天,

y/4-y/100+y/400

该公式表示y(包括y)年前共有多少天闰年

4.

(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) %7

由于每个月份天数都不一样,便于公式映射,这里把1月和2月看成13月份和14月份

有人会问为什么非得把1,2月份当作13 ,14月份呐,为什么不是1,2,3或其他的呐?

因为只有2月份的天数是随着闰年和平年变化的,如果是三月份随着平年和闰年变化的,那就把1,2,3移动到其后面成为13,14,15月份

要问为什么?

看下表:


    误差   累计     模7

3       3         0           0

4       2         3           3

5       3         5           5

6       2         8           1

7       3         10         3

8       3         13         6

9       2         16         2

10     3         18         4

11     2         21         0

12     3         23         2

13     3         26         5

14     -         29         1

发现没有,二月份的误差是不用计算的,所以就解决了二月份天数变化与整年的变化的一致性。

至于这个公式:

2*m+3*(m+1)/5

其实就是用公式对模7的一个映射,你试试,所有的月份大小输进去都可以映射到模7上

你也可以用一个数组存储模7,然后用下标调用

不过还是公式比较好用一点

时间: 2024-11-15 01:31:13

给定年月日,一个公式巧算星期几的相关文章

能用一个公式来计算用户体验吗?

能用一个公式来计算用户体验吗? 我对用一个公式来计算用户体验的追寻来源于一个实验,即我是否能计算一个设计的认知载入时间.当在谈论一个应用的载入速度时,我们常常把关注点放在界面的载入时间上,但是我们会忘了一点,那就是理解一个界面同样也是需要时间的,即所谓的“认知载入时间”.但当我越越来多地研究这个问题时,我越来越意识到载入时间――无论是界面上的还是认知上的――都可能只是一个更重要问题的一小部分,那就是:有没有可能把用户体验量化? 用户体验的问题在于――就像心理学――它是非常模糊的.很多人,包括我在

平方数的口算或巧算

看到电视里讲 999*999 的口算方法: 先去掉一个 9 , 得到 99, 然后后面写个8, 然后 8 前面有几个 9, 后面就写几个 0, 最后加个1, 得到 998001. 敏感的我一看就其中肯定是从计算法则中挖掘的规律.而且没有这么复杂.请看 999*999 =(1000-1)^2 = 1000*1000 - 2*1000 + 1 = (1000-2) * 1000 + 1*1 因此更简单的口诀是: 前面写个 998, 后面写个 001. 前面有几个数, 后面就有几个数. 不信, 你算算

关于时间的操作(JavaScript版)——页面显示格式:年月日 上午下午 时分秒 星期

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

编译原理 龙书 第二章 一个简单的算术式(+,-)翻译器实现

昨天晚上决定正面硬刚神课<编译原理>.硬上龙书. 下面是 一个简单的算术式中缀变后缀的翻译器. 这个也是 龙书中 一个C实现源码 .部分用c++改写. #include <iostream> #include <ctype.h> #include <stdlib.h> #include <stdio.h> using namespace std; int lookahead; void error()//错误处理 { cout<<&q

写给孩子的第一个程序:生成一个TXT口算题文件

学习中Python,孩子嚷嚷说让我给出口算题,于是写了一个生成口算题的程序,我自己觉得很简陋,盼大神们给修改,您的任何建议都是对我最大的鼓励! #!/usr/bin/env python from operator import add,sub,imulfrom random import randint,choice,uniformimport osops={'+':add,'-':sub,'*':imul} def FloatToInt(numList):           ‘把小数为零的

给定项目一个目录结构

我一般都是给定项目一个目录结构bin         项目依赖动态库和可执行文件include     项目依赖头文件libs        项目依赖静态库文件data        项目用到的数据文件doc         项目说明images      项目用到的图片plugins     项目用到的插件src         项目源码style       项目样式表config      项目配置文件---------------------------其中style存放qss文件,程序

时间操作(JavaScript版)—页面显示格式:年月日 上午下午 时分秒 星期

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

以“一个公式” 的角度理解原型链

米娜桑,哦哈哟~ 原型链,已经是一个老生常谈的话题了,这里就不过多总结,精华一张图就可以搞定.该文章更多的是从 一个公式 的角度讲述原型链. 补充说明 实例化:用类(class)创建对象(obj)的过程. 如:TensionMax = new Person(),那么 TensionMax 是 Person 的实例(对象). 但由于 JavaScript 并不存在类,所以 JavaScript 所谓的类,只是我们模拟出来的函数,最终还是基于原型构建. 以下 3 个观点只是为了更方便快捷地理解原型链

给定一个公式字符串用java进行拆解并计算结果

需求很简单,给定一个字符串形式的公式规则,用java代码进行拆解,并能计算出结果. ?考虑字符串中数字格式[整数.小数点] ?考虑字符串中运算符[+-*/()] ?考虑空格.运算规则[被0除] 以下是参考地址,里边有讨论部分的内容: https://bbs.csdn.net/topics/380022283 下边是代码部分,可以作为一个工具类进行使用: package test; import java.util.ArrayList; import java.util.Comparator; i