在网上看到一张2月14日的历史上的今天,说武大郎是公元1178年2月14日死的,和情人节是同一天。我也有点好奇,就稍微研究了一下。

直接点阅读更多看结论。

结论

公元2017年2月14日是农历丁酉年正月十八。武大郎死的日子是宋徽宗政和六年正月二十一日的子夜到二十二日的凌晨,岁次丙申,用当时不存在的格里高利历(也就是现行公历)表示是1116年2月13和14日,用当时的历法儒略历表示是1116年2月6日和7日。去年2016年是丙申年,和武大郎死的年份甲子重合。网图中的年份明显不对,因为宋徽宗在位时间是1082–1135,1178年都不是宋徽宗当皇帝了。

但能因此就说武大郎是情人节死的么?不好说。这个问题可以从以下的角度考虑。

《水浒传》的时间线

我不研究水浒,直接参考别人总结的时间表,武大郎死于宋徽宗政和六年,在通行的一百二十回本里,涉及的描写有:

看看天色黑了,那妇人在房里点上碗灯;下面先烧了一大锅汤,拿了一片抹布煮在汤里。听那更鼓时,却好正打三更。那妇人先把毒药倾在盏子里,却舀一碗白汤,把到楼上,叫声「大哥,药在那里?」武大道:「在我席子底下枕头边。你快调来与我吃。」

那妇人揭起席子,将那药抖在盏子里;把那药贴安了,将白汤冲在盏内;把头上银牌儿只一搅,调得匀了;左手扶起武大,右手把药便灌。武大呷了一口,说道:「大嫂,这药好难吃!」那妇人道:「只要他医治得病,管甚麽难吃。」武大再呷第二口时,被这婆娘就势只一灌,一盏药都灌下喉咙去了。那妇人便放倒武大,慌忙跳下床来。武大哎了一声,说道:「大嫂,吃下这药去,肚里倒疼起来!苦呀!苦呀!倒当不得了!」

这妇人便去脚後扯过两床被来没头没脸只顾盖。武大叫道:「我也气闷!」那妇人道:「太医分付,教我与你发些汗,便好得快。」武大再要说时,这妇人怕他挣扎,便跳上床来骑在武大身上,把手紧紧地按住被角,那里肯放些松宽。那武大哎了两声,喘息了一回,肠胃迸断,呜呼哀哉,身体动不得了!

《水浒传·第二十四回》

……何九叔道:「小人并然不知前後因地。忽於正月二十二日,在家,只见茶坊的王婆来呼唤小人殓武大郎尸首。……

《水浒传·第二十五回》

确切的讲,武大郎死于正月二十一日三更时分,三更合现在的24时制是23:00–1:00,从书里难以看出武大郎到底是三更过了多久才死,所以按出现的日期二十二日算。

儒略历 vs. 格里高利历

——武大郎哪天死的?
——宋徽宗政和六年正月二十二,阳历1116年2月14日。
——可是阳历(格里高利历)是1582年才有的啊?1116年怎么有阳历?
——那也要按照基本法格里高利历去计算。

如果你直接把这个日期在兩千年中西曆轉換计算,发现当时是「西元1116年2月7日」。查一下发现,公历(格里高利历)是1582年才有的,在1582年之前都是儒略历,所以,上面的网页里给出的是儒略历的日期,换算成「虚拟的」(外推的)格里高利历是2月14日。如果你不信可以在那个网页里面看一下1582年10月的日历。也就是说,即便是当时的西方有情人节,也绝对不会在那一天过,因为当天在当时的日历上写的就是「2月7日」。

关于表示历史上日期的表述可以看学术界权威的说法

应该在哪天纪念武大郎

根据上面说的原则,如果以公历为准的话应该是每年的2月7日是武大郎的忌日。如果是农历的话是每年正月二十二。请问,在武大郎的忌日里面有没有公历是2月14日,甲子也是丙申的呢?世界之大无奇不有,1716年是丙申年,公历的2月14日是农历正月二十二。从武大郎死往后数1000年就这一年是这样的。如果不管甲子,也不管什么格里高利历和儒略历,只要沾2月14号就算,那么,有以下的日子是可以写段子的:

儒略历 格里高利历
1116-2-7 1116-2-14
1156-2-14 1156-2-21
1162-2-7 1162-2-14
1175-2-14 1175-2-21
1181-2-7 1181-2-14
1192-2-7 1192-2-14
1194-2-14 1194-2-21
1213-2-14 1213-2-21
1232-2-14 1232-2-21
1257-2-7 1257-2-14
1276-2-7 1276-2-14
1295-2-7 1295-2-14
1297-2-14 1297-2-21
1308-2-14 1308-2-22
1327-2-14 1327-2-22
1344-2-6 1344-2-14
1363-2-6 1363-2-14
1373-2-14 1373-2-22
1401-2-5 1401-2-14
1411-2-14 1411-2-23
1420-2-5 1420-2-14
1430-2-14 1430-2-23
1439-2-5 1439-2-14
1449-2-14 1449-2-23
1458-2-5 1458-2-14
1460-2-14 1460-2-23
1477-2-5 1477-2-14
1506-2-14 1506-2-24
1534-2-4 1534-2-14
1544-2-14 1544-2-24
1553-2-4 1553-2-14
1563-2-14 1563-2-24
1564-2-4 1564-2-14
1582-2-14 1582-2-24
1583-2-4 1583-2-14
1601-2-14 1601-2-24
1629-2-4 1629-2-14
1639-2-14 1639-2-24
1667-2-4 1667-2-14
1685-2-14 1685-2-24
1686-2-4 1686-2-14
1696-2-14 1696-2-24
1715-2-14 1715-2-25
1716-2-3 1716-2-14
1734-2-14 1734-2-25
1735-2-3 1735-2-14
1772-2-14 1772-2-25
1781-2-3 1781-2-14
1792-2-3 1792-2-14
1818-2-14 1818-2-26
1837-2-14 1837-2-26
1848-2-14 1848-2-26
1849-2-2 1849-2-14
1867-2-14 1867-2-26
1887-2-2 1887-2-14
1913-2-14 1913-2-27
1925-2-1 1925-2-14
1932-2-14 1932-2-27
1936-2-1 1936-2-14
1951-2-14 1951-2-27
1955-2-1 1955-2-14
1970-2-14 1970-2-27
1989-2-14 1989-2-27
2001-2-1 2001-2-14
2027-2-14 2027-2-27
2039-2-1 2039-2-14
2046-2-14 2046-2-27
2058-2-1 2058-2-14
2077-2-1 2077-2-14
2084-2-14 2084-2-27
2088-2-1 2088-2-14
2103-2-14 2103-2-28
2107-1-31 2107-2-14
2122-2-14 2122-2-28
2141-2-14 2141-2-28
2160-2-14 2160-2-28

有意思的是,22年后的2039年农历正月二十二正好是阳历的2月14日情人节。唉,不知本文能否活到那一天的到来。

🙏

谨以此文纪念死于书中那位悲剧人物武大郎。


代码

以上的这些结果都是用Emacs的calendar工具算的,比如上面的表是用如下代码实现的(需要最新的Emacs 26):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
(make-thread
(lambda ()
(let ((c 63)
(y 33)
(m 1)
(d 22)
(absolute)
(gregorian)
(julian)
(out))
(require 'calendar)
(require 'cal-china)
(with-output-to-temp-buffer "*output*"
(while (<= c 80)
(thread-yield)
(when (> y 60)
(setq y (- y 60))
(setq c (1+ c)))
(setq absolute (calendar-chinese-to-absolute (list c y 1 22)))
(setq gregorian (calendar-gregorian-from-absolute absolute))
(setq julian (calendar-julian-from-absolute absolute))
(princ (format "儒略历:%d-%d-%d\t格里高利历:%d-%d-%d"
(nth 2 julian) (nth 0 julian) (nth 1 julian)
(nth 2 gregorian) (nth 0 gregorian) (nth 1 gregorian)
))
;; (if (<= (nth 2 gregorian) 1582)
;; (if (and (= y 33) (= 2 (nth 0 julian)) (= 14 (nth 1 julian)))
;; (princ "\t*\n")
;; (princ "\n"))
;; (if (and (= y 33) (= 2 (nth 0 gregorian)) (= 14 (nth 1 gregorian)))
;; (princ "\t*\n")
;; (princ "\n")))

(if (or (and (= 2 (nth 0 julian)) (= 14 (nth 1 julian)))
(and (= 2 (nth 0 gregorian)) (= 14 (nth 1 gregorian))))
(princ "\t*\n")
(princ "\n"))

(setq y (1+ y)))))))