心算日期
无意间看到这篇文章,算法系列之十七:日历生成算法-中国公历(格里历)(下)
受到一些启发,发现其实稍微掌握一些小技巧,就能很简单地将日期和周几建立起联系。
蔡勒(Zeller)公式:
week = ( year + year / 4 + century / 4 - 2 * century + 13 * (month + 1) / 5 + day - 1 ) % 7
year: 取年份的后两位。如2015年取15;1990年取90。
century: 世纪数减1,即年份的前两位。如2015年取20;1990年取19。
month: 月份
day: 日
注: 在计算公式中的除法均为整除。
例: 2015年5月19日即 year=15, century=20, month=5, day=19
例外情况: 1月和2月在计算时需要看做上一年的13月和14月。
故,2015年1月1日的运算变量为 year=14,century=20, month=13, day=1
这个公式虽然看起来有些复杂,不过可以做一些简化:
1. 可以将century和year这两个变量揉成一个常量,然后这几年的计算只要记得几个常量就可以了。
2. 乘以13除以5的这部分可以转换为乘以26,然后做一个10的整除,其实就是舍去个位。
于是,我们将公式转换成:
2014年计算公式
week = (26 * (month + 1) /10 + day - 19) % 7
2015年计算公式
week = (26 * (month + 1) /10 + day - 18) % 7
2016年计算公式
week = (26 * (month + 1) /10 + day - 16) % 7
随手算一个今天的便是 ((26 * 8)/10 + 18 - 18) % 7 = 6,周六。
同时,如果你知道今天是周几,但是忘了今天是几号,也可以用这个公式来算出这个月周几的是哪几天,然后回忆一下便可以知道今天是几号。
当然,这些来回折腾地算都不如直接看一下日历来得简单。不过多一种方法,让日历了然于心,少一些干扰,或许也是一件好事。