《東邪西毒》里歐陽鋒說:初六日,驚蟄。由此推斷,當時可能是哪一年?

歐陽峰:初六日,驚蟄。每年這個時候,都會有一個人來找我喝酒,他的名字叫黃藥師。這個人很奇怪,每次總從東邊而來,這習慣已經維持了好多年。今年,他給我帶了一份手信。


感謝 @明鏡 提供的文獻信息(三千五百年曆日天象表(1).pdf_百度知道),此文獻中包含準確的宋代曆法信息,公布正確答案:

翻遍公元1150年-1250年100年間的驚蟄日,只有這兩天符合真實曆法。

--------------------------------以下是原回答--------------------------------

很難用現代曆法推算古代日期,因為農曆曆法幾經修訂,過去的曆法跟現在完全不一樣19年7閏,或者農曆19年日期重合一說,純屬無稽之談。

如果非要計算,也絕非 @林鉞 的那種演算法,那種演算法是錯誤的!不僅僅不符合農曆曆法,也不符合實際天象:

1197年3月6日,滿月,應該是農曆十五或者十六,先不說是不是驚蟄,但肯定不是初六:


先說現代曆法與古代曆法的差異:

1. 節氣制定的方式不同:現在節氣用的是定氣法,始於明崇禎曆書,沿用至今,節氣的確定原則是根據黃道經度,把黃道平均分成24份;而古代因為觀測條件不足,用的是平氣法,就是簡單的把回歸年分成24份,換句話說,古代的節氣與節氣之間的天數是相同的(稱之為氣策)。現在的定氣法因為地球公轉速度不均勻(開普勒第二定律:開普勒第二定律),所以節氣與節氣之間的天數不固定。

節氣的變化會導致設置閏月的差異,因為使用平氣法的時候一般採用的是無中氣置閏(中氣(中國古代天文曆法名詞)),平氣法可能會導致很多閏臘月、閏正月出現,但定氣法則很難遇到。所以拿現代曆法規則去推算,到明末就不管用了。

2. 曆法測量的基準點不同:現行農曆是正確的名字是紫金歷。紫金歷的測量基準點是東八區標準時間,而古代則用的是北京地方時(東經116度),甚至於其它地方時(比如:應天府也就是今天的商丘、臨安也就是今天的杭州的地方時),這實時上有幾分鐘的差距,不要小看這幾分鐘,這幾分鐘就能導致閏月的不同,甚至大小月的不同。

3. 測量精度不同:古代不可能精確測量24節氣的發生時間,測量精度只能到「天」,但現在24節氣能精確到分鐘,這也會影響大小月和節氣的確定。

以上三條就足可以產生巨大的差異,更別提古代曆法經常修訂:民國使用《國民歷》,清朝使用《時憲歷》,明末是《崇禎曆書》,元朝使用《授時歷》,南宋就修訂好好幾次曆法,每次修訂會重新計算回歸年(用於計算節氣的氣策),年的長度都不一樣,精度也不一樣,日期要想對上就更不可能了。

歷代曆法使用情況:農曆(中國傳統曆法)

公曆在公元1582年去掉了十天,所以節氣對應的公曆日期會有一個整體的偏移,這就導致了:現在的冬至雖然是在12月22日附近,但在南宋時期,公曆對應的可能要減去10天,冬至可能就是12月12日附近了

這還沒完,在以千年計算的尺度上,地球的歲差現象會變得非常明顯(歲差_百度百科),二十四節氣的位置大概以每100年1度的速度在黃道上移動,南宋至今有將近1000年,移動10度也會讓日曆有比較明顯的變化。

所以結論就是無法用現代曆法去推演古代的日期,用的根本不是同一套東西。

網上流傳的所謂的萬年曆,基本上也就能保證前後幾十年是準確的,超過百年可能就有偏差,如果以千年的尺度衡量,基本上沒有太準的。

參見:
為什麼陰陽曆的重合大多以 19 年為周期? - 李雷的回答
我們現行用的是哪部農曆曆法?有統一的標準嗎? - 李瀟的回答
2015年我30歲的生日,陰曆和陽曆重合了,一般不是19年重合一次? - 陽曆

------------------------------------------如果非要計算,該怎麼算------------------------------------------

古代農曆有兩個特點:

計算用的歲首是冬至點,冬至所在月份為冬月(十一月),以兩個冬至來計算當年的情況(如閏月),冬至日是精確等於太陽黃道經270度(因為日影最長,古代可精確測量)。

24節氣在南宋時期用的是平氣法,平氣法的計算方法是把一個回歸年平均分成24份。當時的回歸年大概是365.2425日(統天曆),節氣與節氣之間的間距是15.2184375日(也就是一個氣策的長度,古人用一種更奇怪的方式計算,不表述),冬至到驚蟄是5個節氣,一共是76.0921875日。

所以可以通過計算,獲得南宋時期所有驚蟄日對應的公曆日期。

我採用的方法是利用占星軟體Astrolog的計算介面,這個軟體可以計算上下幾千年的星盤信息,只要取得太陽黃道經是270度的日期,就是冬至。(Astrolog就是算命的那個東西,自動排盤用的都是Astrolog的源碼改的)

再在冬至日的基礎上加上76.0921875日,就得到驚蟄的日期,注意,這裡無法直接通過黃經計算得出驚蟄的日期,因為平氣法中,驚蟄日不是黃經345度

得到驚蟄日期以後,可以通過Astrolog計算,得到當時的月相,通過月相可以得到驚蟄日是當月的農曆初幾,因為農曆以朔月為初一。

總結演算法就是:

1. 遍歷一個大範圍日期的冬至日並獲得驚蟄日;
2. 確定驚蟄日的月相;

所以,只要保證月相數據正確的情況下,計算公元1150年到1250年的驚蟄日能得到下面的疑似數值(原來數據錯了,這裡有改動):

儒略曆 黃經/儒略曆 月相值 節氣/農曆日
1182/12/16 269.70
1183-2-22 35.03
1183-2-23 20.95
1183-2-24 6.69
1183-2-25 7.57 疑似初一
1183-2-26 338.34
1183-2-27 324.57
1183-2-28 311.25
1183-3-1 298.42
1183-3-2 286.08 驚蟄?

通過人工核對,最終能確認符合天文曆法的只有1183年的驚蟄(註:原來演算法中,有一個巨大的錯誤,把每天的分界點算成了中午12點,應該是半夜12點才對,經過校正以後,只有一組數值符合)

真實曆法中,還有一天也是初六驚蟄:

儒略曆 黃經/儒略曆 月相值 節氣/農曆日
1163/12/17 270.32
1164-2-23 20.25
1164-2-24 6.86 疑似初一
1164-2-25 6.31
1164-2-26 340.82
1164-2-27 328.31
1164-2-28 316.21
1164-2-29 304.48
1164-3-1 293.10 驚蟄?
1164-3-2 281.98 驚蟄?

這個數據並未被我找到,原因可能是1164年的氣策並非我找到的數值。

如果非要讓我選一個日子的話,我認為1183年更靠譜一些,當然從曆法上來說,其餘的都符合曆法。

附上計算代碼(VB6),原來計算有錯誤,已經更正:

Option Explicit
"外部API介面,調用Astrolog計算星圖
Private Declare Function Get_Chart_Info Lib "C:Astrolog_Dll.dll" (ByVal birthinfo As String, ByRef star_info As Double, ByVal star_count As Long, ByRef house_info As Double) As Long
"冬至日到驚蟄日之間的距離,單位是天
Private Const DistanceOfJingZhe = 76.0921875

"主計算介面,I為年份,後面兩個變數是要計算的範圍

Private Sub CalcDate1(ByVal I, ByVal CountDayFrom, ByVal CountDayTo)
Dim J As Long
Dim S As String

Dim Stars(0 To 9) As Double
Dim Houses(0 To 11) As Double
Dim Distance As Double
Dim MiniDay As Long
Dim JD As Long
Distance = 100
For J = 1 To 31
"S為星盤計算需要的字元串
S = 12 " " J " " I " 0:00 ST -8:00 120:00:00E 30:00:00N"
Get_Chart_Info S, Stars(0), 10, Houses(0)
"stars(0)是太陽黃道坐標度數
If Stars(0) &< 273 And Stars(0) &> 266 Then
If Abs(Stars(0) - 270) &< Distance Then Distance = Abs(Stars(0) - 270) MiniDay = J Else S = 12 " " MiniDay " " I " 0:00 ST -8:00 120:00:00E 30:00:00N" Get_Chart_Info S, Stars(0), 10, Houses(0) Dim K As Long "輸出冬至日信息 Print #1, I "/" 12 "/" J, FormatNumber(Stars(0)) "按參數要求輸出指定範圍的月相 For K = CountDayFrom To CountDayTo Dim NextDate As Date NextDate = DateAdd("d", K, CDate(I "-" 12 "-" J)) S = Month(NextDate) " " Day(NextDate) " " year(NextDate) " 0:00 ST -8:00 120:00:00E 30:00:00N" Get_Chart_Info S, Stars(0), 10, Houses(0) "Stars(1)是月亮黃道坐標,與太陽求差值,最小的時候就是朔月,初一 Print #1, " ", NextDate, FormatNumber(Abs(Stars(0) - Stars(1)), , vbTrue) Next K Exit For End If End If Next J End Sub Private Sub Command1_Click() Open "C:JD2.TXT" For Output As #1 "專門計算三年的星圖 CalcDate1 1190, 0, DistanceOfJingZhe CalcDate1 1201, 0, DistanceOfJingZhe CalcDate1 1201, 0, DistanceOfJingZhe Close #1 End Sub Private Sub Command2_Click() Dim I As Long Open "C:JD.TXT" For Output As #1 For I = 1150 To 1250 CalcDate1 I, DistanceOfJingZhe - 8, DistanceOfJingZhe Next I Close #1 End Sub

幾點注釋:
1. astrolog用的是儒略曆,在南宋時期與現代曆法有10天的偏差。
2. 不需要關注公曆閏年的問題,因為公曆閏年不影響計算。
3. 先算出100年內的所有月相,人肉排除掉所有不是初六的年份(掃一眼就看出來,大部分都不符合),之後專門算一下剩下的年份的詳細月相就可以了(為了排除閏月)。

在千年的大尺度上,一切曆法應該以天文觀測為準,但考慮到李雷回答里說的那種情況,古人的測量本來就有偏差,那麼想要得到一個準確的日期只通過天文計算是非常困難的,還需要與古代曆書上特定的日期作為參照點,才能準確得出歷史上真實的農曆日期。

南宋時期,曆法多次調整,所以精確計算那個時代的年曆非常困難。


古代的問題要用古代的視角。
古代的日子要用古代的曆書。中國並不是長期以來一直維持大一統局面,中國傳統曆法也並非是一直以來長期正確。
我很常用的例子就是,蘇頌訪問契丹國的時候。同樣使用農曆的兩國,冬至日差一天
實際上朔望,冬至,差一天的情況是有的。古代的天文學水平並不是像現在這樣發達,所以推算古代曆法還是要按照古代的方法——即便那些方法是錯誤的。
直接用朔望數據,乃至冬至數據,都是不可取的。射鵰背景為宋朝,是我國曆法更迭最頻繁的朝代之一,實在不宜用當代技術和當代天文數據回推——實際上絕大多數古代曆日都不宜用當代天文數據回推,這一點,樓上兩個答案在某種程度上大同小異。
冬至時刻應該用氣積分求大余小餘,然後累加氣策。經朔也宜用當時的數據和方法來著。這個過程不難,關鍵是麻煩。

原因很簡單,古代曆法並不嚴格貼合天象。比如日食,按照現代的天文觀點,一定會發生在朔日。但是古代不這樣,古代初三都是有可能發生日食的——眾所周知,既然發生日食,一定是日月合朔了。但是不在朔日而在初三,說明月相已經錯的很離譜了。
所以要想用古代的曆日,有辦法:根據各個史書中律歷內容推算,配合出土曆日表,基本上能夠還原當初曆書的面貌了。
類似這種:

抱歉宋代的我沒搜到這種書。此外,我本來寫了用淳熙歷推驚蟄內容,但是因為不是程序員,純筆算,寫一半懶得寫了。結論大概是,淳熙歷雖然歲實和朔策明顯不對,但是這一年計算出來結果和北極的結果差不多。
冬至日小餘1962,驚蟄日小餘2483.25,,離滿元法遠著呢。


紫金山天文台有位老師出版了一部《三千五百年曆日天象》,裡面有宋朝歷譜,翻一下就行。


謝邀。

剛看到這個問題的時候我是完全懵了的,一句初六日驚蟄就想推斷年份,這提問也要按照基本法來啊。

不過仔細想來這個問題似乎也不是完全沒有規律可尋,雖然初六日驚蟄這句話看起來完全是王導為了台詞效果隨口胡謅的,但要根據此來推斷出當年的年份也不是不可能。

首先我們來看題目里的驚蟄,一般來說,驚蟄對應的公曆日期是固定的,平年是3月6日,閏年是3月5日,比如今年2016年是閏年,驚蟄日是3月5日。

再看這個初六日,一般來說驚蟄前後已經入春,,因此這個初六日不大可能是指農曆一月初六,而應該是農曆二月初六。

那麼按照這個思路,現在我們只需要找到歐陽鋒在沙漠中開客棧的那段時間中農曆二月初六正好是驚蟄日,也就是公曆3月5日或6日的一年就可以了。

當然,沒有哪個歷史會告訴我們一千年前哪一年的農曆二月初六是驚蟄日,不過不要怕,在曆法中,有一個隱藏的規律——每過19年,農曆和公曆會完全重合在一起,也就是說,我們只要找到近幾年農曆二月初六是驚蟄日的年份,然後以19年為周期推算到宋朝就可以了。

於是我打開了手機日曆往前翻了幾年,果然找到了這麼一個日子。

公元2014年3月6日,農曆二月初六驚蟄日。

看起來問題很簡單了是不是?但問題來了,宋朝歷經300多年,就算有19年一個周期,我們還是不知道歐陽老闆在沙漠開客棧的時間具體是哪幾年啊。

不過不要著急,大家想想歐陽老闆是為什麼來到沙漠開客棧的?還不是因為心愛的女人成了大嫂所以心情鬱悶難耐。那在歐陽老闆離開白駝山時發生了什麼?嗯沒錯,就是他的嫂子懷了他的孩子。

這個孩子就是歐陽克。

所以說,我們只要找到歐陽克的出生日期,在歐陽克出生日期的之後的某一個二月初六正好是驚蟄日的年份,就是題目里所說的那一年。

於是問題又來了,作為一個小配角,金老爺子在《射鵰英雄傳》里壓根沒有說明歐陽克的出生日期。

但是沒關係,我們可以曲線救國,我們不知道歐陽克的出生日期,但可以根據主角郭靖郭大俠的出生日期來進行推斷。《射鵰英雄傳里》描寫歐陽克出場時是這樣的:

「 只見那人一身白衣,輕裘緩帶,神態甚是瀟洒,看來三十五六歲年紀,雙目斜飛,面目俊雅,卻又英氣逼人,身上服飾打扮,儼然是一位富貴王孫。」

可以看出,歐陽克出場時大概三十五六歲,而此時郭靖剛好十八歲,也就是說,歐陽克比郭靖大十七八歲。因此只要搞明白了郭靖的出生日期,就可以推算歐陽克的出生日期,進而推算歐陽老闆在沙漠里開客棧的時間。

關於郭靖的出生日期金庸並沒有直接寫,但根據拖雷與郭靖的年齡對比來看,拖雷比郭靖大3歲,拖雷出生於1193年,因此郭靖應該出生於1196年。

然而, 事情沒有這麼簡單,如果換個參照人,在《射鵰》結尾成吉思汗死亡時郭靖21歲,而成吉思汗死於1227年,那麼郭靖應該出生於1206年。

金老爺子這是在逗我?到底哪個才是郭靖的出生日期?

算了,不要著急,我們繼續來考察原文,《射鵰》第一章里寫到郭靖的爹郭嘯天在酒館裡與人喝酒,一起痛罵秦檜坑害了岳飛,原文這樣說:

張十五替郭、楊二人斟了酒,自己又斟一杯,一口飲干,說道:「岳爺爺有兩句詩道:『壯志飢餐胡虜肉,笑談渴飲匈奴血。』這兩句詩當真說出了中國全國百姓的心裡話。」唉,秦檜這大奸臣運氣好,只可惜咱們遲生了六十年。」郭嘯天問道:「若是早了六十年,卻又如何?」張十五道:「那時憑兩位這般英雄氣概,豪傑身手,去到臨安,將這奸臣一把揪住,咱三個就吃他的肉,喝他的血,卻又不用在這裡吃蠶豆、喝冷酒了!

由此可見,此時離秦檜誣陷岳飛導致其被殺過去了60多年,岳飛死於1142年,因此郭靖應出生於1202年之後。與以上推測中後一個更為接近,除此之外,在《射鵰》最後一章里提到郭靖屬牛:

黃蓉笑道:「不是要用十二頭牛?你生肖屬牛,是不是?」

如此推算,郭靖的出生日期只能是1205年牛年。而歐陽克的出生日期大致是1188年或1189年。

在離這個日期之後最近的農曆二月初六為驚蟄日的年份,就是問題所問的年份,這個年份應當是2014-19×43=1197年。

也就是說,公元1197年3月6日,黃藥師前往沙漠尋找歐陽鋒喝酒,並給他帶去一份手信。

希望以上解答能讓題主滿意。

———————補充一下的分割線—————

看到大家喜歡這個答案,我也很開心,不過看到許多人的留言,還是想聲明一下,將近一千年前的節氣和日期當然難以推算,19年一個周期也並不是完全準確,這個答案不過是以這麼個思路來進行推斷娛樂一下而已,否則哪能真的知道一個順口胡謅的初六日驚蟄是哪一年,大家看看一笑就好,不用太當真啦。如果真的對曆法感興趣,想要看精確的演算,推薦前去@北極 的答案圍觀哦。


@靳東 請專家答疑解惑。


初八日,驚蟄。


金庸:我當時就是隨便寫的!


話說公曆不是近代才傳入中國的么。初六自然是農曆初六,但驚蟄是初八,所以電影瞎扯淡的。


推薦閱讀:

作為太陽曆,公曆每年的第一天為什麼不在天文意義更明確的冬至,而是現在的 1 月 1 日?
五行是不是五大行星?(金木水火土星?)?
曹操正宮卞夫人的生日究竟是哪天?
農曆大年初一有沒有可能和公曆的1月1日是同一天?
趙生群認為,《史記》記事迄於太初,太初以後所記載的事件,是後人補竄。 『太初』是哪一年?

TAG:天文學 | 曆法 | 節氣 | 推理 | 東邪西毒電影 |