最近因為在研究內政部的人口統計資料,不小心坑越挖越多,索性研究起所謂孤鸞年對於結婚人數到底有多大影響。但是要做這個比較,首先就得知道哪些年是孤鸞年。可能是我搜尋功力太差,實在是找不到一個完整的孤鸞年列表,只能從歷年的新聞搜尋結果知道哪些近代的特定年份是孤鸞年。於是我轉而研究孤鸞年的定義到底是什麼,最後是反覆看了這篇百度百科的條目後,總算想通立春、太陽曆與孤鸞年之間的關係是什麼。

簡單來說,立春是天文上的一個時刻,在這一刻之後,立夏之前,就是所謂的春天。當然傳統習俗上,就是把「立春」所在的這個日曆天稱為立春。接著最常見的問題就是,你可能知道所謂的二十四節氣都是根據太陽所在的黃經位置所訂定的,跟基於月亮的陰曆一點關係都沒有。但是為什麼基於農曆的孤鸞年,會與立春有關呢?原來立春每年固定都會落在太陽曆的2月3日、4日、5日其中一天,但是我們都知道農曆大年初一的日子是很不固定的,所以有時候一放寒假就過年,有時候則是寒假結束前才過年。因此大家可以想像,有時候除夕和大年初一的太陽曆日期會落在立春之前,有時候會落在其之後。也因此,一個農曆年最多有可能會包含兩次立春(該農曆年的初一在同年的立春之前,除夕在隔年的立春之後),也有可能完全沒有包含立春,又或者恰好有一個立春。有兩次立春的農曆年稱之為孤鸞年,沒有立春的農曆年則稱為寡年或寡婦年。

知道了孤鸞年的定義,也知道了只要計算農曆年涵蓋的立春次數,就可以算出孤鸞年。現在只剩下一個變數:每年的立春到底是哪一天。已知立春一定會落在太陽曆的二月的3、4、5三天其中一天,而且通常落在4號,但是這樣還是不夠精確。事實上有時候初一或除夕恰好會落在立春這天或前後一天,所以知道精確的立春日期還是必要的。根據維基百科的建議,我使用JPL的線上星曆系統直接把 1800 年到 3100 年的太陽軌道資料下載下來,再去分析每一年太陽是在哪一天通過黃經315度,也就是立春的天文定義。

最後缺少的一塊拼圖,是如何快速轉換太陽曆跟陰曆的日期?這裡要感謝 lidaobing 開源的 python-lunardate提供了這個重要的功能。

以下就是最近的 100 年的立春次數表。此外我也做了一個簡單的 JSON 檔案,可供查詢每一年的立春發生次數。

1950 到 2049 孤鸞年與寡婦年列表

西元年份 干支紀元 生肖 立春次數 備註
1950 庚寅 1  
1951 辛卯 0 寡婦年
1952 壬辰 2 孤鸞年
1953 癸巳 0 寡婦年
1954 甲午 1  
1955 乙未 2 孤鸞年
1956 丙申 0 寡婦年
1957 丁酉 2 孤鸞年
1958 戊戌 1  
1959 己亥 0 寡婦年
1960 庚子 2 孤鸞年
1961 辛丑 1  
1962 壬寅 0 寡婦年
1963 癸卯 2 孤鸞年
1964 甲辰 0 寡婦年
1965 乙巳 1  
1966 丙午 2 孤鸞年
1967 丁未 0 寡婦年
1968 戊申 2 孤鸞年
1969 己酉 1  
1970 庚戌 0 寡婦年
1971 辛亥 2 孤鸞年
1972 壬子 0 寡婦年
1973 癸丑 1  
1974 甲寅 2 孤鸞年
1975 乙卯 0 寡婦年
1976 丙辰 2 孤鸞年
1977 丁巳 1  
1978 戊午 0 寡婦年
1979 己未 2 孤鸞年
1980 庚申 1  
1981 辛酉 0 寡婦年
1982 壬戌 2 孤鸞年
1983 癸亥 0 寡婦年
1984 甲子 2 孤鸞年
1985 乙丑 1  
1986 丙寅 0 寡婦年
1987 丁卯 2 孤鸞年
1988 戊辰 1  
1989 己巳 0 寡婦年
1990 庚午 2 孤鸞年
1991 辛未 0 寡婦年
1992 壬申 1  
1993 癸酉 2 孤鸞年
1994 甲戌 0 寡婦年
1995 乙亥 2 孤鸞年
1996 丙子 1  
1997 丁丑 0 寡婦年
1998 戊寅 2 孤鸞年
1999 己卯 1  
2000 庚辰 0 寡婦年
2001 辛巳 2 孤鸞年
2002 壬午 0 寡婦年
2003 癸未 1  
2004 甲申 2 孤鸞年
2005 乙酉 0 寡婦年
2006 丙戌 2 孤鸞年
2007 丁亥 1  
2008 戊子 0 寡婦年
2009 己丑 2 孤鸞年
2010 庚寅 0 寡婦年
2011 辛卯 1  
2012 壬辰 2 孤鸞年
2013 癸巳 0 寡婦年
2014 甲午 2 孤鸞年
2015 乙未 1  
2016 丙申 0 寡婦年
2017 丁酉 2 孤鸞年
2018 戊戌 1  
2019 己亥 0 寡婦年
2020 庚子 2 孤鸞年
2021 辛丑 0 寡婦年
2022 壬寅 1  
2023 癸卯 2 孤鸞年
2024 甲辰 0 寡婦年
2025 乙巳 2 孤鸞年
2026 丙午 1  
2027 丁未 0 寡婦年
2028 戊申 2 孤鸞年
2029 己酉 0 寡婦年
2030 庚戌 1  
2031 辛亥 2 孤鸞年
2032 壬子 0 寡婦年
2033 癸丑 2 孤鸞年
2034 甲寅 1  
2035 乙卯 0 寡婦年
2036 丙辰 2 孤鸞年
2037 丁巳 1  
2038 戊午 0 寡婦年
2039 己未 2 孤鸞年
2040 庚申 0 寡婦年
2041 辛酉 1  
2042 壬戌 2 孤鸞年
2043 癸亥 0 寡婦年
2044 甲子 2 孤鸞年
2045 乙丑 1  
2046 丙寅 0 寡婦年
2047 丁卯 2 孤鸞年
2048 戊辰 0 寡婦年
2049 己巳 1  

備註

以下是為了產生上表,我另外寫的輔助函式

干支年查詢

def zodiac(year):
    if year < 1:
        raise Exception('僅支援西元後年份')
    zodiacs = '鼠牛虎兔龍蛇馬羊猴雞狗豬'
    return zodiacs[ (year-4) % 12  ]

生肖年查詢

def ganzhi(year):
    if year < 1:
        raise Exception('僅支援西元後年份')
    stems = '甲乙丙丁戊己庚辛壬癸'
    branches = '子丑寅卯辰巳午未申酉戌亥'
    return stems[ (year-3-1) % 10 ] + branches[ (year-3-1) % 12 ]