伶州鸠对周景王所述武王伐殷时天象
周景王打算铸造名为“无射”的大钟,向乐官伶州鸠请教音律。说到“七律”的由来,伶州鸠追述了五百年前武王伐殷时的天象。这几句话收在《国语·周语下》,两千年来让注家和历算家都颇为头疼。
在“夏商周断代工程”里,作者负责“武王伐纣时的天象研究”专题。他们认为这段话是天文历史年代学上罕见的珍贵文献,并逐条对它作了现代天文学的回推。下面先把原文放在这里。点击任意一句,右侧会显示韦昭注、作者的释读,以及这一句在全文推算中承担的角色。
44 种异说、16 条天象均出自作者同时期的其他论著与演讲(见卷末出处)。本文只是作者“几种不同方案”中的一种,以伶州鸠这段话为主线展开。
以韦昭注为出发点,逐句释读
前人释读这段话,大多依据三国时人韦昭(204–273)的注。有人怀疑韦注,甚至认为整段文字是后人伪作。作者的态度是:若有比韦昭更可信的不同释读,自然应该舍韦昭而就彼;若并无更可信之释读,却又无端怀疑韦昭之注,除了导致历史虚无主义的结论之外,对解决问题毫无帮助。韦注是现存最早的注本,还保留了东汉郑众、贾逵,三国虞翻、唐固等已亡佚注本的片段,历代学者对它也没有异议。所以作者以韦注作为工作的起点。
“辰在斗柄”一句的争议最大。古籍中“辰”字有八种用法:
第四至第八种用法放在这里讲不通,可以先排除。剩下三种里,“斗柄”无论指什么,总归是恒星。心宿二和北极星也是恒星,恒星之间相对固定,一颗恒星不可能跑到另一颗恒星那里去,那就和说“天狼星在织女星”一样荒谬。所以只能取韦注“日月之会”的解释。
“斗”可以指北斗,也可以指南斗,即二十八宿中的斗宿。但太阳和月亮只在黄道附近运行,永远到不了北斗,所以这里的斗只能是南斗。下面这幅动画演示了其中的道理:恒星随天球整体转动,彼此的相对位置不变;只有日、月沿黄道移动,因此只有日、月才可能“在”某颗恒星那里。
“鹑火”“析木”“天鼋(玄枵)”都是十二次的名称,“天驷”和“斗”则属于二十八宿。作者依据《汉书·律历志》所载刘歆《三统历》中十二次与二十八宿的对应关系(例如析木之次是“尾十度”到“斗十一度”),再用岁差推算距星在当时的黄经,就得到了各次的黄经范围。作者特别说明,这样做并不要求商周之际已经存在十二次系统,因为关键在于传下来的数据,表达数据的方式可以随时代改变。
| 原文 | 释读 | 在推算中的角色 |
|---|---|---|
| 岁在鹑火 | 木星在鹑火之次。字面上没有歧义。 | 暂不使用,留作参证 |
| 月在天驷 | 天驷即天蝎座 π 星,也是房宿的距星(韦注:“天驷,房星也”)。月亮运行到紧挨这颗星的地方。 | 第一步筛选 |
| 日在析木之津 | “津”指天河。析木之次横跨银河,前 1100—前 1000 年间的黄经约为 223°—249°。 | 第一步筛选 |
| 辰在斗柄 | 日、月在南斗(斗宿)合朔。 | 验证 |
| 星在天鼋 | 辰星(水星)在玄枵之次,约为黄经 278°—306°。 | 验证 |
| 星与日辰之位皆在北维 | 玄枵所在的女、虚、危诸宿属北方七宿。这一句不含独立信息。 | — |
DE404 星历表、SkyMap 与 ΔT 修正
要回推三千年前的天象,首先需要足够精确、时间跨度又足够长的行星和月球历表。1963 年斯塔曼(Stahlman)用分析方法编算过公元前 2000 年至公元 2000 年的日、行星位置表,但精度不高,用起来也不方便。另有一些学者自己用天体力学方法回推,却从不公开源程序,旁人无从比较优劣。
美国喷气推进实验室(JPL)的斯坦迪士(Standish)等人用数值积分方法,结合雷达、射电、VLBI、宇宙飞船、激光测月等观测资料,编成了覆盖公元前 3000 年至公元 3000 年的 DE404 星历表。它的误差估计为:行星每世纪约百分之一角秒,月球约一角秒。经作者联系,斯坦迪士本人将全套 DE404 数据库和计算软件无偿提供给他们使用。
演示天象用的是 SkyMap 3.2。作者用 DE404 检验过它的精度,前推三千余年时,误差仍在角秒量级。
DE404 给出的是均匀流逝的“历书时”,而地球自转在潮汐摩擦等作用下长期变慢。要把天象还原到当地的真实钟点,必须修正两者之差 ΔT。作者指出,三千年前的这项修正将近 8 小时。这个差值足以把清晨的天象推到另一个时段,或者让观测地点在经度上错开一百多度。
前人几乎都把目光集中在“岁在鹑火”上,《左传》《国语》中“岁在某某”一类记载也常被当作重要判据。作者对两书中有明确年代的岁星记载作了地毯式检索,共得 9 项,用 DE404 回推后发现竟无一吻合。日本学者新城新藏曾试图解释这一现象,他假定古人按岁星恰好 12 年一周天来推排,倒推出一个起算年份,即公元前 376 年;但这个解释无法覆盖所有记载,起算点本身也来历不明。
所以作者先不用“岁在鹑火”,只把它留作辅助性的参证,到第玖卷再回头讨论。
第一步筛选:从一百二十年里挑出十三天
月亮每月绕天一周,看起来“月在天驷”每月都会出现一次。作者提醒:精密计算表明,这种天象在周地平均要 10 年左右才能与“日在析木之津”同时被看到一次。原因有两个:
其一,月球轨道与黄道之间有约 5° 的倾角,而天驷(天蝎座 π)的黄纬是 −5.09°。只有当月球黄纬在 −5° 左右时,月亮才会恰好贴着天驷,从它正上方或正下方经过,甚至把它掩住,这才算真正的“月在天驷”。月球轨道的交点以 18.6 年为周期退行,月亮在天驷处的黄纬也随之缓慢起伏。
其二,这种天象通常发生在清晨,位置靠近周地的地平线,常常还没升上地平天就亮了。
作者据此设定三个条件,用 DE404 计算公元前 1119 年至前 1000 年间的日、月位置:
| (1) | 太阳黄经在 223°—249° 之间(日在析木之津) |
| (2) | 月球与天驷星的黄经差小于 2°(月在天驷) |
| (3) | 月球黄纬小于 −4.5°。天驷星在前 1050 年前后黄经 200.74°、黄纬 −5.09°,月球偏离黄道的极限约 5.5°,因此留出约 1° 的变动范围,天驷恰在其中 |
关于复算。论文只给出了筛选条件,没有交代逐日计算的采样时刻,所以本站的复算结果与表 1 并不逐一对应:前 1101.11.24、1099.12.1、1082.11.24、1045.12.3、1026.12.4、1007.12.4 六天两边相同,其余日期互有出入。不过表 1 的 13 天在本站计算中日干支全部吻合,下一卷各日清晨的岁星情形也与表中描述一致。
十三天中,只有一天清晨的东方只见岁星
伶州鸠这段话本身无法在 13 天中作出取舍,作者转而借助其他文献。关于岁星(木星),古籍中除“岁在鹑火”外还有三条记载:
武王伐纣,东面而迎岁。《淮南子 · 兵略训》
武王之诛纣也,行之日以兵忌,东面而迎太岁。《荀子 · 儒效》
武王征商,佳甲子朝,岁鼎克昏,夙有商。利簋铭文
前两条说的是周师出发东行时,在东方迎见岁星。至于出发的日子,韦昭注为“殷十一月二十八日戊子”,这一说法应本于刘歆《三统历·世经》中的“师初发,以殷十一月戊子”。刘歆的说法原本可以怀疑,但除此之外别无他说。作者的做法是先把它当作假设:若结果与其它文献不能吻合,自可疑之;若处处吻合,则自应信其为真也。
在表 1 中,日干支离戊子最近的是公元前 1045 年 12 月 3 日丁亥,次日正是戊子。更巧的是,只有这一天真正符合“东面而迎岁”:清晨东方只见岁星一颗行星,位置极好,此后多日都是如此。其余各日,或者东方看不到岁星,或者虽然能看到,却有金星、土星同在。点击下表任意一行,就能看到当天清晨周地东方的天空。
| 日期(公元前) | 日干支 | 岁星天象(论文表 1) |
|---|
论文图 1 是用 SkyMap 3.2 绘制的地平坐标星图,天顶在上,地平在下,图中有地平高度圈、方位线和黄道虚线,Vir、Lib、Sco 等星座名与木星、天王星都标在原处。本站按同样的视角重绘了这幅图,并且可以让时间流动起来。“原刊样式”仿照论文的黑白版式,“夜空样式”则按当时的晨昏光照渲染。
到这里可以初步设定:武王伐纣之师于公元前 1045 年 12 月 4 日(戊子)出发。作者还补充说,周师在这一天前后若干天内出发,都合乎情理。
日干支的推算有一个前提:纪日干支自古连续至今,从未错乱。作者承认这个假定“有点无奈”,但没有它一切都无从谈起,而且至今也没有发现决定性的反例。
辰在斗柄:两次朔,一次望,与一张日程表
出兵的日子定下来以后,另外两条史料就能派上大用场:
惟一月壬辰,旁死霸,若翌日癸巳,武王乃朝步自周,于征伐纣。粤若来三(当作二)月,既死霸,粤五日甲子,咸刘商王纣。《汉书 · 律历志下》引《尚书 · 周书 · 武成》
惟一月丙午旁生魄,若翼日丁未,王乃步自于周,征伐商王纣。越若来二月既死魄,越五日甲子朝,至,接于商。则咸刘商王纣。《逸周书 · 世俘解》
“死魄(霸)”指新旧月之交,月亮完全不可见,也可以理解为朔;“生魄”指望。这些月相术语的定义历来有“定点”“四分”等说法,争论多年没有定论。1998 年李学勤先生撰文论证,在《武成》《世俘》中,依文义月相只能取定点说,这就解开了伐纣年代研究中的一个死结。
按《武成》的历日,周师出发之后、甲子克商之前,应当有两次朔:第一次的日干支为辛卯或壬辰,第二次约在克商前五日,为庚申或辛酉。考虑到周初定朔可能有一日之差,这两个日干支都留有一天余地。从周地到牧野约九百里,若按每日行军三十里计,一个月左右比较合适。这种“反叛中央”的战役也必须速战速决,以免勤王之师赶来救援。
计算表明,周师出发三天后的公元前 1045 年 12 月 7 日辛卯出现一次朔,次日就是壬辰,与《武成》“惟一月壬辰旁死霸”非常吻合。若把“旁死霸”理解为“旁朔之日”,连一天的误差也没有了。这次朔时太阳黄经为 246.27°,而考虑岁差后,当时斗宿的范围在黄经 237.64°—261.51° 之间,朔正好发生在斗宿之中。
继续验证《武成》《世俘》中其余的月相和干支:
辛卯朔之后 15 天,即公元前 1045 年 12 月 22 日,是望日,日干支丙午。《世俘》说“惟一月丙午旁生魄”,与实际天象精确吻合。
下一次朔:按《武成》“既死霸,粤五日甲子”,甲子日为公元前 1044 年 1 月 9 日,则“既死霸”应在 1 月 5 日庚申。实际的朔发生在次日辛酉,仍只差一天。
通常认为,《世俘》中的“惟一月丙午旁生魄”应按《武成》改为“壬辰旁死魄”,“若翼日丁未”应改为“癸巳”。作者的验算表明,这样的改动不但没有必要,而且很可能是错的,因为丙午那天恰好是望,“若翼日丁未”的说法自然也没有问题。作者给出了一个新的解释:周师先期出发;《武成》的“王朝步自周”是说武王从周地出发,《世俘》的“王乃步自于周”是说武王从周地来到军中。也就是说,武王在壬辰旁死魄的次日(癸巳)启程,到丙午旁生魄的次日(丁未)与大部队会合。这样,两篇文献不必改动一字,就能同时讲通。
辰星两度入玄枵:一次为昏星,一次为晨星
“天鼋”即玄枵之次,在武王伐纣的时代约为黄经 278°—306°。辰星(水星)离太阳最远不过 28° 左右,很难看到,据说哥白尼终生以没能观测到水星为憾。按中国古代的经验公式,水星与太阳的距角超过 17° 才能看见。用 DE404 计算前 1045 年 12 月至前 1044 年 3 月的水星位置,结果是:
从前 1045 年 12 月 21 日起,水星进入玄枵之次,与太阳的距角超过 18°。这时它作为“在天鼋”的昏星,至少有 5 天可以在日落后看到。
更巧的是,甲子克商之后,从前 1044 年 2 月 4 日至 24 日,水星再次处在玄枵之次,距角达到 19.99°—27.43°,几乎到了大距的极限。这时它成为“在天鼋”的晨星,更容易观测,日出前可见的日子有 20 天之多。这也说明了为什么“星在天鼋”会作为伐纣时的重要天象一代代传下来,最后由伶州鸠讲给周景王听。
最后一句“星与日辰之位皆在北维”不含独立信息。太阳和水星到达玄枵之次时,正位于女、虚、危诸宿之间,这些都属于北方七宿。
甲子之朝,岁星正中
最后一项验证来自唯一一件同时代的实物。1976 年,陕西临潼出土了一件有铭文的青铜簋,作器者名叫利,世称利簋。铭文记载“武王征商,佳甲子朝,岁鼎克昏,夙有商”,是迄今所见唯一直接记述武王伐纣的古文字材料。张政烺最早提出,铭文中的“岁”应释为岁星;李学勤认为这一说法“能照顾铭文全体,又可与文献参照,应该是最可取的”。“岁鼎”就是木星上中天,即木星运行到当地子午线上,在正南方达到最大高度。
按《武成》“粤五日甲子,咸刘商王纣”,克商的甲子日是公元前 1044 年 1 月 9 日。这天清晨的牧野有没有木星上中天?作者用 SkyMap 3.2 作了演示,结果令人惊奇:当地时间 4:55,岁星恰好上中天,地平高度约 60°,正是最便于观测的角度,而且南方天空中没有其他行星。
作者这样设想当时的情景:周师应该已经晨起列阵,正南方出现“岁鼎”,不只太史看得见,万众大军都看得见。如果此时太史指着天空说“岁鼎佳兆,正应克商”,军心自然振奋。此正星占学之妙用也。
至此可以看到,伶州鸠所述的一系列天象,与《武成》《世俘》所载日程、《淮南子》《荀子》所述岁星天象一一吻合。再根据《武成》“粤五日甲子,咸刘商王纣”和利簋铭文,牧野之战的日期就可以确定了。
伐纣是一个时间段,而不是一天
伶州鸠的话包含四条独立信息:岁在鹑火、月在天驷、日在析木之津、星在天鼋。后三条都经过了推算和多重验证,说明伶州鸠的说法相当可信。那么为什么偏偏“岁在鹑火”对不上?
计算表明,从周师出发到甲子克商,岁星的黄经约在 168°—170°,位于当时的寿星之次,确实与“岁在鹑火”不合。
作者指出,这个问题并非无解。“武王伐纣”是一个时间段。狭义地说,它指从周师出发到甲子克商;广义地说,它可以是一个两年多的过程,就像人们说抗日战争打了 8 年一样。《史记·周本纪》载:
九年,武王上祭于毕,东观兵,至于盟津。……是时,诸侯不期而会盟津者八百诸侯,诸侯皆曰:纣可伐矣!武王曰:女未知天命,未可也,乃还师归。居二年,闻纣昏乱暴虐滋甚,……《史记 · 周本纪》
牧野之战的前两年,武王已经在孟津作过一次军事示威,八百诸侯会于孟津,这完全可以看作“武王伐殷”的开始。按本文推算的年代,那一年是公元前 1047 年。DE404 的计算表明,这一年岁星在黄经 68°—107° 之间运行,而当时鹑火之次的范围是 96.63°—129.91°,下半年大部分时间岁星都在鹑火之次。
所以作者认为,伶州鸠说的“昔武王伐殷,岁在鹑火”同样是正确的。不过作者也强调,这并不能证明《左传》《国语》中其他岁星记载正确,那个问题还需要另外解决。
表 2 武王伐纣天象与历史事件一览
伶州鸠所述各项天象的排列顺序很值得注意:它们实际上是按伐纣进程中天象出现的先后来记录的。照这样看,说这段话是武王伐纣时留下的天象实录,并不过分。作者综合《武成》《世俘》《国语》《淮南子》《荀子》《史记》中关于伐纣天象和史事的全部重要记载,重建了一张精确的日程表。
作者回顾说,开始工作时,并没有认定伶州鸠所述天象一定是伐纣时的实录,只是把它当作“故老相传,当有所本”的史料。如果回推计算表明当时确有这些天象,就不能轻易断定它们是后人伪作。实际算下来,这些天象不仅与真实天象精确吻合,还与《武成》《世俘》《淮南子》《荀子》、利簋铭文处处相合。
这项工作完全没有参考考古学、甲骨学和碳十四测年的结果,只在对古籍存疑的前提下用天文学方法“姑妄算之”。经过复杂而苛刻的验算和筛选,各种文献竟然能够相互对应,并且只建立起唯一的一张伐纣日程表。作者由此感叹:“古人不我欺也!”他们认为,这一结果反过来也印证了古籍中关于伐纣天象的绝大部分记录是真实的,许多关于刘歆伪造天象史料的说法其实缺乏根据。
李学勤先生在《伶州鸠与武王伐殷天象》(1999 年 1 月 18 日作)中得出了三点结论,作者称之为“旨哉斯言”:
“岁在鹑火……”一段话,是《周语下》原文,不可能为后世窜入。
伶州鸠家世任乐官,武王时天象应为其先祖所传述。
五位三所是武王伐殷过程中一系列占候,不能作为同时天象来要求。
美国学者倪德卫(David Nivison)曾认为这段话是“公元前一世纪中叶,有一个狡猾的学者真相信了《武成》的日期”而伪造的。作者指出,倪氏犯了一个根本性的错误:他认定伶州鸠所述诸天象必定是同一天的天象。本文的整个思路正是从推翻这一预设开始的。
此后的讨论、本站的复算方法
“夏商周断代工程”最终没有采用前 1044 年。工程把克商之年定为公元前 1046 年,2022 年发布的《夏商周断代工程报告》又给出了牧野之战的具体日期:公元前 1046 年 1 月 20 日(见光明网 2023 年 6 月 7 日的报道)。两种结论分歧的根源,在于对文献天象的取舍不同,以及是否采纳碳十四测年和金文历谱等其他证据。
本文的结论后来扩充为专著《回天——武王伐纣与天文历史年代学》(上海人民出版社 2000 年版;上海交通大学出版社 2014 年新版)。学界也有商榷意见,例如 2002 年发表的《〈国语〉“武王伐殷”天象检讨——兼论江晓原、钮卫星之〈回天〉》。
论文原用 DE404 和 SkyMap 3.2,本站的复原图则另行计算: