还记得小学的时候看到过计算某年某月某日是星期几的方法,当时觉得好神奇啊,当时一直不明白为什么一个简简单单的式子或者一张表格就能够算出任何一天是星期几呢,这些方法伴随我度过了整个童年。

长大后就知道了它们的原理,因为星期是七天为一个周期,只要已知某一天是星期几,要算任何一天是星期几只要求出两个日子之间的天数就可以了。现在的编程语言几乎全都包含了获得星期的方法,程序员们再也不用为此发愁。但还是让我们回忆一下孩童时期的乐趣吧,或许以后可以用来逗孩子玩呢。

公式法计算星期几

这是我最早知道的计算某一天是星期几的方法,还曾经在同学的 Casio 可编程计算器上做了个简单的程序来自动计算,真是有趣的回忆。

设 Y 是公元年数(比如今年的话,Y 等于 2011),D 是从同年元旦到指定的这天未为止的天数(包含这一天,比如 1 月 1 号的话,D 就是 1),那么指定日期的星期数为:

\begin{equation*} W=\left((Y-1)+\left\lfloor\frac{Y-1}{4}\right\rfloor-\left\lfloor\frac{Y-1}{100}\right\rfloor+\left\lfloor\frac{Y-1}{400}\right\rfloor+D\right)\bmod7 \end{equation*}

结果 0 代表周日,1~6 分别代表星期一~星期六。

以今天为例,2011 年 8 月 10 日,先求出今年元旦到今天有多少天(包含今天),显然 D=31+28+31+30+31+30+31+10=222,代入公式得到:

\begin{equation*} \begin{array}{rcl} W & = & \left((2011-1)+\left\lfloor\frac{2011-1}{4}\right\rfloor-\left\lfloor\frac{2011-1}{100}\right\rfloor+\left\lfloor\frac{2011-1}{400}\right\rfloor+222\right)\bmod7 \\ & = & (2010+502-20+5+222)\bmod7 \\ & = & 2719\bmod7 \\ & = & 3 \end{array} \end{equation*}

今天是周三,没错呢。

表格法计算星期几

上面的公式虽然简单明了,但对于小学时候的我却还是非常头疼的,四则运算不过关的人伤不起啊!下面这个表格法则没有任何计算了,我还特意添加了 JavaScript 使得它更容易使用。

使用方法非常简单,比如还是看今天是星期几,按照以下三步进行:

  1. 在百年数区域里找到 20,在年份后两位数字区域里找到 11。由 20 所在横行向右,11 所在竖行向下,交于 F。
  2. 在月份区域里找到 8,向左在同一横行里找到 F。
  3. 在日期区域里找到 10,在同一横行向左,同时由(第 2 步中找到的)F 所在竖行向下,与 10 所在横行相交于星期区域里的“三”。

可见同样求出今天是星期三。

另外注意在月份区域中的 1' 和 2' 分别表示闰年的 1 月和 2 月。比如算 2000 年 1 月某天是星期几,就要在月份区域里选择 1'。

猛烈点击 这里(calendar_week.html) 可以在新的页面中打开星期万年历表格。如果你的浏览器支持 IFRAME,可以在文章底部看到同样的表格。

啰嗦两句

根据公式或者表格都可以算出公元 1 年 1 月 1 日是星期一,那天到底是不是星期一呢?我不知道,而且也没有实际的意义,因为这个历法是罗马教皇格里高利十三世在 1582 年 10 月 15 日启用的,而英国及其殖民地直到 1752 年 9 月 14 日才使用现在的历法,所以算这之前甚至公元前某日是星期几毫无意义。另外,1582 年 2 月 24 日教皇下令去除 1582 年 10 月 5 日至 14 日,1752 年英国国会下令去除 1752 年 9 月 3 日至 13 日,所以 1752 年 9 月 14 日是星期四,但 1752 年 9 月 2 日却是星期三而不是星期六。 这也是为什么我在表格的百年数区域里从 15 开始写。

Like this post? Share on: TwitterFacebookEmail

Comments

So what do you think? Did I miss something? Is any part unclear? Leave your comments below.

comments powered by Disqus

Published

Category

有用知识

Tags

Stay in Touch