“明月幾時有?把酒問青天。不知天上宮闕,今夕是何年。”蘇軾的這首《水調歌頭·明月幾時有》想必大家都不陌生,其中的“天上宮闕”意為月亮上的宮殿、特指月亮。只不過,蘇軾不知道當年的月亮上是何年何月,我們卻能計算出來。
常識科普
地球上的早晨和傍晚,我們可以看到日出前和日落后的光芒,這種現象叫做“晨昏蒙影”、又叫作“曙暮光”。
?
?
但是月球上由于沒有大氣,光線不能散射,因此看不到這種美麗的景象,月球上的晝夜交替是非常突然的。
?
?
同時,月球的晝夜交替是自轉和公轉共同作用的結果,其晝夜交替要比地球慢地多。一般來說,月球上太陽“升起”后要經過160多小時才能到達月球的正當空,從正當空落到“月平線”以下又需要160多小時,這是月球上的白晝;
?
再經過320多小時的黑夜,才是月球上完整的一天。準確來說,地球上的一天是23小時56分04秒,而月球上的一天則是655.71984個小時,也就是說,月球上的一天大約相當于地球上的27.32天。
計算思路
僅僅知道了時間長度還不足以計算日期,我們還需要設置一個基準點,本文中,我們將公元1年1月1日的0時為月球和地球共同的時間基準點,這樣一來,計算月球上的日期就變得可行了。
-
第一步,對于某個特定的地球歷,可以計算出它距離基準時間點過了多少天,例如公元0年1月2日18時距離基準時間點過了1.75天;
-
第二步,根據地球和月球一天時間長度的對應關系,計算出月球日期距離基準時間點的天數,例如上一步中的地球日期在月球上相對基準時間點經過的天數為0.064天;
-
第三步,根據月球上相對基準時間點經過的天數,計算月球上的日期。
當然,這樣計算得出的月球日期會有些許誤差,事實上,威斯康星大學麥迪遜分校地球科學教授斯蒂芬·梅爾斯團隊的最新研究表明,月球正以約3.82厘米/年的速度緩慢離開地球,導致地球自轉變慢,地球上的每一天也在慢慢變長。
在14億年前,月地之間的距離更近,地球自轉得更快,當時地球上的一天僅為18小時。
?
這樣看來,我們對月球日期的計算誤差也就在可接受范圍之內了。
Python實現
計算思路清晰了,用python實現起來也就非常簡單了。具體代碼實現如下:
其中,我們依次構建了幾個函數:
- get_standard用來計算基準時間點
- get_earth_days計算指定地球日期距離基準時間點的地球天數
- get_moon_days計算指定日期距離基準時間點的月球天數
- get_moon_date用來計算指定地球日期相對應的月球日期。
下面我們就來測試一下程序運行情況,蘇軾的《水調歌頭·明月幾時有》寫于“丙辰中秋”,根據推算應該是公元1076年9月21日,假設當時時間為20時,那么我們的地球日期輸入就是“1076-09-21 20”,把它放到程序中跑一跑,就得到了當時的月球日期40年5月17日,也就是詞中“天上宮闕”的年月了。
?
* 本文轉載自公眾號菜鳥學 Python