精华内容
下载资源
问答
  • [转贴] 快速计算某个日期是星期几的经验公式 巧算星期几 基姆。拉尔森 基姆拥有计算机学科的博士学位。他对数据库,算法和数据结构有着浓厚的兴趣。他的联系地址是 (原文为丹麦文--译者注) 31,DK-5270...
     
     
    


    巧算星期几

    基姆。拉尔森

    基姆拥有计算机学科的博士学位。他对数据库,算法和数据结构有着浓厚的兴趣。他的联系地址是 (原文为丹麦文--译者注) 31,DK-5270,Odense N,Denmark,或发 E-mail 至 :kslarsen@imada.ou.dk。

    简介

    布鲁斯 施耐尔

    “四,六,九,十一,三十天就齐……”儿歌是这么唱的;或许你也曾经掰着手指头翻来覆去地数,让赶上单数的指头代表只有30天的短月吧?这样的口诀对我们是很管用的(我就是念叨着这首傻乎乎的儿歌长大的),可是电脑就没有这份“灵感”了。当然,我们可以用一大堆IF-THEN-ELSES的语句或几个CASE来编写计算程序,让它计算某个指定日期是星期几。

    不过我更喜欢基姆拉尔森在本月的“算法小径”中为我们带来的新技巧,因为他的方法另辟蹊径,从一个全新的方向着手解决日期计算的问题。其实,并没有什么数学公式能算出某个指定日期是星期几,不过我们可以试着拼凑一个,如果我们的尝试成功了,你就能拥有一个易于编程的数学公式,并能用它自动计算哪天是星期几了。

    顺便说一句,如果你已经设计出更巧妙的算法,或是在已有的方法上有了新突破的话,不妨告诉我,我一定洗耳恭听。我的联系方法是schneier@chinet.com,或者在DJJ编辑部给我留张便条就行。

    你有没有疑惑过你的电脑怎么就知道今天是星期三呢?就算你的电脑关机了,你重启后设定了新日期,它也能立即知道这天是星期几。

    在你还是个孩子的时候,你可能见过一种纪录记录着年,月,日的表格,只要加上几个数字,和它相连的另一张表格就会告诉你这个日期是星期几。当然,计算机硬盘的操作系统里也可以加入这样的计算表。不过有一种简单的方法可以轻松地算出某天是星期几;而且这个方法只占用很少的内存空间,而那些只能推算几百年的表格可就太占地方了。

    如果目前你的电脑还不具备推算与日期对应的星期数的功能,现在就不妨在自己的程序中试试下面的公式。

    创建公式

    首先,我们要用变量D,M和Y来表示日期。比如,1994年3月1日就用“D=1,M=3,Y=4”记录。我们的目标是让计算结果在0到6之间。0代表星期一,1代表星期二,2代表星期三,依此类推。

    1994年3月1日是个星期二,那么“D mod 7(日期变量除以7的余数))))”这个公式对于整个三月份都有效。比如3月18日是星期五,18 mod 7=4;而4正代表星期五。别忘了,整数的除法和求模有着密切的关系。比方说,26除以7商3余5,这就是说,26除以7商数取整等于3,而26除以7求模(简写为26 mod 7)等于5。以上这些意味着19 mod 7=12 mod 7= 5 mod 7=5。在运算规则中,负数求模运算法相似,所以依此类推,-2 mod 7=5, -9 mod 7=5。

    在更正式的表达法中,统一用任意整数n和k表达上述关系,那么这个过程可以表达为n=qk+r,这里的q和r的取值范围同样是整数和0。表1中列出了所有月份的变换数据(shift information此处试译为“档级数据”,还请进一步校对--译者注)。为了尽可能地得出规律,二月被排在最后,同理,一月也是如此。

    例1(a)中的公式是仿照表1中的变换数据栏所描述的模式而创建的。这个公式中的除法一律是商数取整。所以得数是最接近真正商数的整数。表2得出了此功能得出的有趣的数值。凭直觉,我们不难发现,当M(代表月份的变量)的值以1为单位递增时,2M就成倍增长,而3(M+1)/5就以3/5为增长倍数。

    这正是我们仿制3,2,3,2,3这个重复格式所需要的(表中右边的弯括号表明了这一点)。请注意,我们在以7为除数求模,那么从6到2的求模结果就会逐个增加3(顺序是6,0,1,2)。

    现在,我们发现了适用于逐月向下推算的校正方法,并希望把它加入刚才的尝试中,就是那个mod7公式。还以1994年3月1日为例,这个日期的M=3。请注意,在例1(b)中,8 mod 7=1,所以当整个公式合并时,必须减去1。在做以7为除数求模的运算时,减1和加6是一样的,因为-1 mod 7=6 mod 7=6。

    这样,例1(c)中的公式就可以计算这一年中剩下的月份了。其实,既然我们把一月和二月排在表1的最后,那么只要我们把它们看成是十三月和十四月,就能接着推算1995年的前两个月了。这是因为,虽然它们并不是一个完整的3,2,3,2,3结构,但恰好可以是这个结构的开始,为了使这个公式更完善,我们还是最好把一月和二月看成是上一年的十三月和十四月。

    加入年份

    顺着年份向下找,我们观察到1995年3月1日是星期三。这说明,每增加一年,我们公式的计算结果就会增加1。这太简单了,我们只要简单地把年份加上去就行了。再提醒你一次,我们必须确保出发点是正确的。由于1994 mod 7=6,我们在把Y加入已有的公式时就必须减去6。由此改进的例2(a)就更完善了。

    1996年是个闰年,这带来了我们的下一个问题。这一年的3月1日是星期五,而不是刚才的公式推算出的星期四。所以每当我们碰上闰年时还得多加上1。判断闰年的规则是,能被4整除,并能被100和400同时整除的年份就是闰年。就这样,我们在原有的基础上添加Y/4--Y/100+Y/400。再强调一下,我们必须从一开始就确保正确。既然(1994/4--1994/100+1994/400) mod 7=(498--19+4) mod 7=483 mod 7=0,所以就不用再做任何调整了。这样,例2(b)就是我们最终的成果了。这个公式能一直工作下去,除非改变现行的日历系统。作为示例,让我们试着推算一下2000年7月4日:(4+2*3+(7+1)/5+2000+2000/4--2000/100+2000/400) mod 7= (4+14+2000+500--20+5) mod 7=2507 mod 7=1,所以那一天是星期二。

    这个公式还能推算过去的日期;然而计算范围有限,让我们看看1752年9月14号这个星期四吧,我们的公式最远只能推算到这里了。不过像“1963年11月22日你在哪里”这样的日常问题中提到的日期还是可以轻松应对的:(22+2*11+3(11+1)/5+1963+1963/4--1963/100+1963/400) mod 7=(22+22+7+1963+490--19+4) mod 7=2489 mod 7=4。那天就是星期五。

    例3例子3是一个C语言程序,按照把这个公式自动推算给定日期是星期几。

    表1:每月变换数据

    月份 天数 变换

    三月 31 3

    四月 30 2

    五月 31 3

    六月 30 2

    七月 31 3

    八月 31 3

    九月 30 2

    十月 31 3

    十一月 30 2

    十二月 31 3

    一月 31 3

    二月 28 3

    表2:仿制变换数据形式的功能。例1中建立的公式可以适用于1994年。例2把这个公式的功能扩展到可以应用在不同的年份进行推算。

    例3:用C语言程序表达上述公式

    /*计算指定日期是星期几。默认输入的*/

    /*数字代表正确的日期*/

    /* 推算给定日期是星期几,假定输入是正确的数据 */
    #include
    char *name[] = { "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday",
    "Friday",
    "Saturday",
    "Sunday"
    };
    void main(){
    int D,M,Y,A;
    printf("Day: "); fflush(stdout);
    scanf("%d",&D);
    printf("Month: "); fflush(stdout);
    scanf("%d",&M);
    printf("Year: "); fflush(stdout);
    scanf("%d",&Y);
    /* January and February are treated as month 13 and 14, */
    /* respectively, from the year before. */
    if ((M == 1) || (M == 2)){
    M += 12;
    Y--;
    }
    A = (D + 2*M + 3*(M+1)/5 + Y + Y/4 - Y/100 + Y/400) % 7;
    printf("It's a %s.\n",name[A]);
    }

    /*一月和二月被当作前一年的*/

    /*十三月和十四月分别处理*/

    展开全文
  • 【oj】计算一万天后的日期

    千次阅读 2019-06-07 21:50:35
    1.编写目的 刷OJ题时的笔记:输入日期,要求输出一万天以后的日期。 2.详细过程 输入 输入有多行,格式为YY MM DD 其中1949<=YY<=2006,日期绝对合法。... * 计算一万天以后的日期 * 作者:Smileyan * 20...

    1.编写目的

    刷OJ题时的笔记:输入日期,要求输出一万天以后的日期。

    2.详细过程

    输入

    输入有多行,格式为YY MM DD 其中1949<=YY<=2006,日期绝对合法。

    输出

    输出有多行。即CCC老师生日第一万天以后的日期,格式为 “Y-M-D”。

    代码

    #include<stdio.h>
    
    /**
     * 计算一万天以后的日期
     * 作者:Smileyan
     * 2019/6/7
     */
    
    /* 判断是不是闰年 */
    bool function(int year) {
        if((year%4 == 0 && year%100 != 0) || year%400==0) {
            return true;
        }
        return false;
    }
    
    
    
    int main() {
        int a,b,c;
        while(scanf("%d%d%d",&a,&b,&c)==3) {
            short ary[12]={31,28,31,30,31,30,31,31,30,31,30,31};
            int day = 0;
            for(;day<=10000; day++) {
                if(function(a)) {
                    ary[1]=29;
                }else{
                    ary[1]=28;
                }
                // day
                if(c<ary[b-1]) {
                    c++;
                    continue;
                }
                // month
                if(b<12) {
                    b++;
                    c=1;
                    continue;
                }
                // year
                a++;b=1;c=1;
            }
            //cout<<a<<"-"<<b<<"-"<<c-1<<endl;
            printf("%d-%d-%d\n",a,b,c-1);
        }
    
        return 0;
    }
    

    简单说来,就是单纯地数数,日数满日这个月的最大天数,就加月,月超过12了就加年数。

    3.总结

    很多时候其实用看起来最愚蠢的方法解决问题却是最简单的方法。

    Smileyan 2019年6月7日

    展开全文
  • 如何快速计算出星期几

    千次阅读 2017-03-29 15:57:02
    有的时候需要根据日期快速计算出星期几来,我从网上搜索到一个口诀,验证了几个日期,发现还是靠谱的,这个公式的证明目前我还不会,但可以保证2000-2099的星期计算是靠谱的,其他时间我没有验证过。 const u8 ...

    有的时候需要根据日期快速计算出星期几来,我从网上搜索到一个口诀,验证了几个日期,发现还是靠谱的,这个公式的证明目前我还不会,但可以保证2000-2099的星期计算是靠谱的,其他时间我没有验证过。

    const u8 month_code[][12]={
        {6,2,2,5,0,3,5,1,4,6,2,4},
        {5,1,2,5,0,3,5,1,4,6,2,4},
    };
    
    int calc_week(u8 nian,u8 yue,u8 ri)
    {
    	u8 isloop;
    	u8 yc,mc,week;
    
    	isloop=((nian&3)!=0)?0:1;
    
    	yc=(nian/4+nian)%7;
    
    	mc=month_code[isloop][yue-1];  //这里的闰年只是简单判断
    
    	week=(yc+mc+ri)%7;
    
    	return week;
    }

    简单验证下,2002-3-31是星期日,2020-2-28是星期五,2099-2-28是星期六,2032-7-28是星期三,... ...


    展开全文
  • 前言 如果有这样的问题:如果y年m月d日是星期k,那么请问y1年m1月d1日是星期几?...基尔拉姆森公式:这个公式可以直接计算出那个日期是星期几,但请注意!这类问题如果假设和真实情况不符的时候要记得换上偏移...

    前言

    如果有这样的问题:如果y年m月d日是星期k,那么请问y1年m1月d1日是星期几?

    思路

    • 首先如果询问的日期都在1970年之后的话,我们可以使用Excel直接计算。
    • Java的Calendar类,使用和Excel非常类似,略
    • 直接模拟,注意判断闰年,年份、月份、天数的变化处理
    • 基姆拉尔森公式:这个公式可以直接计算出那个日期是星期几,但请注意!这类问题如果假设和真实情况不符的时候要记得换上偏移量,比如问题假设某个日期是星期一,而真实情况这天是星期二,那么我们计算出来的星期几也要-1,但请保证再1~7的环中。

    Code:

    #include <bits/stdc++.h>
    
    using namespace std;
    
    //基姆拉尔森公式
    int calc_week (int y, int m, int d) {
    	if (m == 1 || m == 2) { //month  13,14,3,...12
    		y--;
    		m += 12;
    	}
    	int tag = (d + 2*m + 3*(m+1)/5 + y + y/400 - y/100) % 7;
    	return tag + 1;
    }
    
    int main(int argc, char *argv[]) {
    	int y,m,d;
    	while (cin >> y >> m >> d) {
    		printf("Today : %04d %02d %02d\n", y, m, d);
    		printf("Week : %d\n", calc_week(y, m, d));
    	}
    	return 0;
    }
    
    展开全文
  • dateutils:漂亮的命令行日期和时间实用程序; Shell中的快速日期计算和转换
  • 计算日期间隔天数的经典算法解析

    千次阅读 2019-07-03 14:25:08
    #include <iostream> using namespace std; int mon[12] = { 0,31,59,90,120,151,181,212,243,273...int cal(int y, int m, int d)//给出年月日,计算距离0000年0月1日的天数和 { return y * 365 + y / 4 - y...
  • Java知识体系最强总结(2021版)

    万次阅读 多人点赞 2019-12-18 10:09:56
    文章目录 Java面试总结 基础知识 Java概述 基础语法 面向对象 集合框架 IO流 网络编程 常用API 日期时间API 常用工具类库 单元测试 异常 日志 Java8新特性 工具 IDEA Eclipse & STS Maven Docker Git GitLab Git...
  • 日期时间间隔计算

    2013-01-29 20:00:45
    日期间隔计算器是一款可以帮助用户计算两个任意日期之间的间隔天数的软件,用户只需在该日期差计算器中输入要计算的前后日期,该软件就会快速计算出两个日期之间的间隔天数
  • 可以快速自动计算,只用财务报表和其他一些别的数据填上后就可以得到现金流量表了。
  • 实例: SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd"); String clidate = "1978-03-30"; Calendar cToday = Calendar.getInstance(); // 存今天 Calendar cBirth = Calend
  • C++计算任意两个日期的天数差

    千次阅读 2020-03-13 00:47:38
    萌新上路,为了完成这个实验题,摸索...2.大体算法是:计算每个日期到当年年底的天数>计算年与年之间的总天数差(此处认为计算年初到年初或年末到年末都行)>用总天数差加上两个日期到当年年底天数之差即为结...
  • Excel中如何巧妙计算结算日期

    千次阅读 2019-07-16 18:22:59
    首先,我们要计算出每个订单交货日期是星期几,并计算出交货日期距离本周结束还有几天时间,输入公式并往下填充:=7-WEEKDAY(C2,2) 接下来根据得出的这个天数加上交货日期计算出当周星期天的日...
  • <br />基本思路如下,以公元1年1月1日为起始日期计算任意一个日期到它的日数是容易计算的,这样,我只要需要计算出两个需要计算日期到公元1的所差天数就可以了。   int getDayCountFromAD1(int...
  • C++之日期计算

    千次阅读 2018-03-07 00:50:59
    日期计算很重要!一、关于闰年闰年是一类比较特殊的年份,闰年比平年(非闰年)在2月份多一天。下面是关于闰年的判断。1. 年份非整百且能被4整除的年是闰年。(例如2004是闰年)2. 年份能被400整除的年是闰年。...
  • C语言计算日期间隔天数的经典算法解析

    万次阅读 多人点赞 2015-02-07 15:46:01
    在网上看到了一个计算日期间隔的方法,咋一看很高深,仔细看更高神,很巧妙。 先直接代码吧 #include #include int day_diff(int year_start, int month_start, int day_start , int year_end, int month_end,...
  • 计算多少天后的日期

    千次阅读 2019-07-30 12:28:38
    C语言:计算多少天后的日期 有的时候我会想,再过个100天是几月几日呢?也许你可以翻翻日历,但是如果是1000天、10000天以后呢?为什么我们不写个小程序来专门处理这个问题呢?似乎也不是很复杂…… 于是这篇博客...
  • Java 计算两个日期的差值

    千次阅读 2020-06-23 14:15:21
    在这篇快速的文章中,我们将探讨Java中计算两个日期之间差值的一些方法。 解决方案 使用 java.util.Date 让我们首先使用Java SE API计算两个日期之间的天数: @Test public void test_TwoDatesDiffBeforeJava8...
  • Java 计算两个日期相差多少年月日

    千次阅读 2019-03-20 16:20:07
    JDK7及以前的版本,计算两个日期相差的年月日比较麻烦。 JDK8新出的日期类,提供了比较简单的实现方法。 /** * 计算2个日期之间相差的 相差多少年月日 * 比如:2011-02-02 到 2017-03-02 相差 6年,1个月,0天...
  • iOS中计算两个日期的间隔的天数

    千次阅读 2016-09-06 11:36:26
    //计算两个中间差值(秒) NSTimeInterval time = [nowDate timeIntervalSinceDate:ValueDate]; //开始时间和结束时间的中间相差的时间 int days; days = ((int)time)/(3600*24); //一天是24小时*3600秒 ...
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    文件为doc版,可自行转成txt,在手机上看挺好的。 本资源来自网络,如有纰漏还请告知,如觉得还不错,请留言告知后来人,谢谢!!!!! ...入门学习Linux常用必会60个命令实例详解 ...Linux提供了大量的命令,利用它...
  • 在Excel中如果快速计算两个日期之间的差? 例如A日期为:2012/3/12 B日期为:2015/7/29 那么这两个日期之间差几年,差几个月,差多少天? 我们使用DateDif 函数来处理。 例如: =DATEDIF(A2,B2,"y") =...
  • Tableau功能区中有关快速计算的问题

    千次阅读 2017-09-18 03:13:10
    Tableau功能区中有关快速计算的问题: 快速计算之——复合增长率:POWER(ZN([薪酬毛利比])/LOOKUP(ZN([薪酬毛利比]), FIRST()),ZN(1/(INDEX()-1))) - 1 快速表计算...
  • 怎么计算两个日期之间的差值

    千次阅读 2015-07-15 21:03:45
    写程序时会遇到比较两个日期之间的差值,差了多少天,或者其他什么,于是自己写了一个方法,供大家参考,也作为自己的备份吧。 日期之间的差值:差了多少天 function DateDiff(sDate1, sDate2){ //sDate1和...
  • 前端面试题

    万次阅读 多人点赞 2019-08-08 11:49:01
    输出今天的日期,以YYYY-MM-DD的方式,比如今天是2014年9月26日,则输出2014-09-26 57 将字符串”{ KaTeX parse error: Expected 'EOF', got '}' at position 3: id}̲</td><td>{ name}”中的{ KaTeX parse error:...
  • 没有参加宣讲会面试的同学则是按照正常笔试面试实习的流程进行(流程会慢一些),并且今年实习日期也减少到了3天,可能是因为扩招,人太多的原因。并且今年是先实习再签约,而邮件中也说了,实习可能会刷人。(也有...
  • 几个主流的输入法输入 rq 或者 sj 都可以得到预定义格式的日期或者时间。然而他们都是预定义的格式;当我们需要一些其他格式的时候该怎么做呢? 本文将介绍几个常用输入法自定义时间和日期格式的方法。 主流...
  • Java日期工具类

    2018-11-14 16:47:21
    Java日期常用工具类,可以快速获取月、周、日以及日期间的差值计算

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 99,848
精华内容 39,939
关键字:

怎么快速计算日期