# 农历和阴历的差别

  • 阴历 = 太阴历的简称。是根据月球围绕地球运转的周期(约等于 29.5 天)制定的历法。大月 30 天,小月 29 天,12 个月为 1 年,1 年 354 天或 355 天。伊斯兰教历就是阴历的一种。
  • 农历 = 中国传统历法。因其与农业生产有关,故称。相传始行于夏代,所以也叫夏历。属阴阳历,人们习惯上把它叫阴历。平年 12 个月,闰年 13 个月。大月 30 天,小月 29 天,平年全年 354 天或 355 天,闰年全年 383 天或 384 天。每年分 24 个节气,便于农事安排。以天干地支搭配纪年,60 年周而复始

# 年的计算方式

按照公历一年会有 365.2422 如果我们计算 365 天 那每年就会多 0.2422 天,因此当 0.2499*4 年 = 0.9996, 就会接近多出一天,而这一天就是四年一度的(闰年)二月 29,但是它是 0.9996 所以每一百年会多出一天,而该年就不计算成闰年,而 400 年后则是计算润年当中

# 月的计算方式

初一 = 塑 ,十五 = 望 加起来则是塑望月,一共 29.53 天 * 12 月 = 354.36 days,那么按照 (一年) 365.2422-354.36 = 会多出 10.8822 天 ,再 * 3 的话就接近一个月,所以三年可以补一个月 但是 10.8822 乘 3 也不等于 29.53 天,所以古人计算最好的补月方式是 19 年补 7 个月,而这七个月就是润月。

  • 因为 19*365.2422(年的转动天数)=6939.6018 天
  • 而 29.53 * 12 * 19 + (7 个闰月 * 29.53) =6939.55
  • 误差相当的小,所以每几百年就会调整一次这个误差
    因为 29.53 为一个月,因此古人划分一些 29 天为小月,30 天为大月(不固定,根据天文观测)

# 24 节气

前面提到的七个闰月是通过 24 节气来补,一年地球转动 360 度 / 24 = 每个节气等于 15 度,
分别名字为 =
立春、雨水、惊蛰、春分、清明、谷雨、立夏、小满、芒种、夏至、小暑、大暑、立秋、处暑、白露、秋分、寒露、霜降、立冬、小雪、大雪、冬至、小寒、大寒
24 节气分成节气和中气,隔着来,立春节气,那么雨水就是中气,下一个就是节气。

计算润月的方式,就是每月绑定一个中气,当中气的日期是在该月里的初始日期和终止日期之间,那么就不需要闰月,而当中气的日期不在该月里的初始日期和终止日期之间,该月就是润月,如果是在四月就叫润四月,那么原本中气就会在下个月出现。

# 节气计算公式

节气和中气的准确日期是按照以下公式来实现,准确度只在 1900-2100 年之间,资料参考 [1]

import math

day_in_month =[31,28,31,30,31,30,31,31,30,31,30,31]

def F(y,x):
    return  365.242 * (y-1900) + 6.2 + 15.22 * x - 1.9 * math.sin(0.262 * x)

#判断闰年
def is_leap_year(year):
    if year % 400 == 0:
    #看看能不能被400整除
    return True
    elif year % 100 == 0:
    return False
    elif year % 4 == 0:
    return True
    else:
        return False

def gets_days_in_month(year,month):
    if is_leap_year(year) and month == 1:
        return days_in_month[month] +1 
    else:
        return days_in_month[month]

def days_to_geogorian_date(n):
     
     #:parameter n:num days from 1900-01-00
     
     y = 1900 
     m = 0
     while n > get_days_in_month[y,m]:
        n =n - get_days_in_month[y,m]
        m = (m + 1)%12
        if m == 0:
            y = y + 1
    year = y  
    month =m + 1
    day = n 
    return year, month , day 

for i in range(0,4):
    days = init F(1900,i)
    y , m , d = days_to_geogorian_date(days)
    print("{}年{}月{}日",format(y,m,d))
#Output = 1月6日 (意思是1900年一月6号就是第一个节气)/1月20日/2月4日/2月19日

# 朔日的计算

那么每月的初始日期和终止日期怎么算呢,就要用到以下公式了


  1. https://wenku.baidu.com/view/3a29278471fe910ef12df84d.html ↩︎

更新于

请我喝[茶]~( ̄▽ ̄)~*

小志 微信支付

微信支付

小志 支付宝

支付宝

小志 贝宝

贝宝