作者:王梨珂 · 更新日期:2025-09-08
公历日期转 ☘ 八字步骤:
1. 获取公历日 🕊 期(年、月 🐝 日、时 🌷 、):
例如:2023年3月8日下 🐧 午3:00
2. 获 🦢 取 🌳 对应的儒略日(JD):
使用儒略 🐬 日计算公式:JD = 367 年年 7 (月 + (月日 + 9) / 12) / 4 + 275 时 / 9 + + 1,721,060.5 + ( 12) / 24
对于给 💐 定 🌲 的示 🐘 例,JD = .625
3. 获取八 🦉 字年干支:
年干 🦄 支 🐘 = (JD + 9) % 60 + 1
对于给定的示例 🍁 ,年干支 = 癸卯
4. 获取八 🐯 字 🐬 月干支 🐼 :
(1)计算月 🐘 令起点儒略日 🐴 月(JDm):JDm = JD 31 ( 1)
(2)计算月建所在八字干支 🐒 编号干支编号 🐠 : = (JDm + 21) % 60 + 1
(3)根据干 🐘 支编号获取八字月干支
对 🌵 于给定的示例,JDm = .625,干支编号 = 14,八 🐧 = 字月干支己卯
5. 获 🌷 取 🦅 八字 🦊 日干支:
(1)计算日干支编号日干支编号:儒 = (略日 🌸 + 9) % 60 + 1
(2)根 ☘ 据日干支编号获取八字日 💐 干支
对于给定的示例 🌺 ,八字日干 🐬 支 = 乙酉
6. 获取八字 🌹 时 🐋 干支:
(1)计算 🐵 时辰干 🦟 支编号时辰干支编号:儒 = ((略日时 ) % 10) 2 + ( / 6)
(2)根据时辰干支编号获取八 🕊 字时 🌾 干支 🐵
对于给定的示例,八字时 🦟 干支 = 辛亥
因此,给定公历日期对应的八字为:癸卯 己卯 🌺 乙 酉辛亥
步 🐋 骤 1:确定公历日期
填写公历日期 🐘 ,包括年、月日、时 🍁 、时(区为 GMT+8)。
步骤 2:计算 🐎 儒 🕸 略 🦊 日数 (JD)
使用儒略 🍀 日历公式 ☘ 计算儒略日数:
JD = 367 年年 (7 (月 🐛 + (月 🐴 + 9)/12)) / 4 + 275 日 🐶 / 9 + 730531.5
步骤 🌷 3:计 🐕 算世数 🌸 (C)
世 🐕 数可以根据儒略日数计算:
C = (JD .5) / 36525
步骤 🌴 4:计算年 🌸 柱
基于世 🦢 数,确定年柱的干 🌴 支:
| 世数 | 年 | 柱 |地支年 🦉 柱天干 🍁
||||| 0 | 子 | 甲 🐛 |
| 1 | 丑 🌳 | 乙 🌷 |
| 2 | 寅 🦈 | 丙 |
| 3 | 卯 🦟 | 丁 🐳 |
| 4 | 辰 🐱 | 戊 🦁 |
| 5 | 巳 🐦 | 己 🐛 |
| 6 | 午 🐡 | 庚 🦍 |
| 7 | 未 | 辛 🐦 |
| 8 | 申 | 壬 🦟 |
| 9 | 酉 🌲 | 癸 🐎 |
步骤 🦉 5:计算 🐡 月柱
基于 🦍 儒略 🕊 日数,确定月柱的干 🌼 支:
| 月份月 🐈 | 柱 | 地 |支月柱天 🐱 干
||||| 1 | 寅 🐞 | 甲 🐋 |
| 2 | 卯 🐠 | 乙 🌺 |
| 3 | 辰 🐈 | 丙 🦢 |
| 4 | 巳 🐒 | 丁 🌼 |
| 5 | 午 🌲 | 戊 💐 |
| 6 | 未 🕊 | 己 🐋 |
| 7 | 申 🐘 | 庚 🐞 |
| 8 | 酉 🌸 | 辛 🐅 |
| 9 | 戌 🐬 | 壬 🦈 |
| 10 | 亥 🐵 | 癸 🦁 |
| 11 | 子 🐋 | 甲 🦋 |
| 12 | 丑 🐺 | 乙 |
如果公历日 🦊 期在下一个农历月 🐝 的 🦟 立春之前,则使用上一个月的月柱。
步 🐝 骤 6:计算日柱
基于儒略 🌾 日数,确定日柱的干支 🌾 :
日柱 🌳 地 🐎 支 = (JD + 9) % 12
日柱天干 = 基于日柱地支对应的 🌵 六甲 🐯 旬日柱天干
步骤 7:计算时 🐧 柱
基 🐺 于儒 🦁 略日数,确定时柱的干支:
时柱地 🐯 支 🌷 = (JD + 1) % 12
时柱天干 = 基于时 🐎 柱地支对 🦟 应的十二时辰天干
将 🦋 公历日期 2023 年 8 月日 15 转 10:00 (GMT+8) 为八 🐎 字日期:
儒略日 🐋 数 (JD): .8125
世 🐦 数 🌴 (C): 782
年柱: 癸卯(世数为 9,对 🐈 应癸 ☘ 卯)
月柱 🐝 : 戊申(公历月 8 在农历月 9 前,使用上个月的月柱)
日柱: 辛亥 🐳 (儒略日数 + 9 取 🐞 余 12 为 亥,对应辛亥)
时柱: 庚寅(儒略日数 🦅 + 1 取余 12 为 寅,对 🌴 应庚寅 🕊 )
因此,八字日期为:癸卯 戊 💮 申 辛亥庚 🐅 寅 🌲
步骤 🦟 1:确定农历年份
找到公 🕸 历年的后 🐈 两位数字。
将 🦊 后两位数字加 3,再除以 12。取余数(111)。
余数即为农历年份的地支编号(子、丑、寅、卯、辰、巳、午、未、申、酉 🦢 、戌、亥)。
步骤 2:确定农历 🐝 月份
找 🦟 到公历月份 🌺 。
如果是 1 月或月 2 则,农 🦋 历月份为上一年 🐦 的农历 🐛 月 12 。
如果是 🦁 3 月到月 12 则,农历月份为 🐟 公历 🌵 月份减去 2。
步骤 3:确定农 🕊 历 🌻 日 🌸
如果 🐎 公历日期 🐎 是 1 号,则 1 农历 🐟 日期为号。
如果公历日期大于 1 号,则 🌾 农历日期为公历日期减去前 🐳 一天的公历日期。
步 🦉 骤 🐕 4:确 🐱 定农历时辰
找到公历日期的 🌲 时间 🌷 (24 小时制)。
将时 🌷 间除以 2,取余数(112)。
余数即为农历时辰的地支编号(子、丑、寅、卯辰、巳、午、未、申、酉、戌 🐱 、亥、)。
对应时辰为余数减 1(子鼠、丑、牛、寅、虎、卯、兔辰、龙、巳 🐠 、蛇、午、马未羊申猴酉鸡戌狗亥猪)。
示例:公历日期 🌿 :2023 年 🌻 3 月日 🌳 15 10:20
农历年份:23 + 3 = 26
26 ÷ 12 = 2 余 🐬 2
农 🐝 历 💐 年 🐡 份:丑(牛年)
农历月份:3 2 = 1
农历月 🦍 份 🦍 :正月
农历日:15 1 = 14
农 🕊 历日:十四 🌷 日 🕸
农历时辰:10:20 ÷ 2 = 5 余 🦅 0
农 🕸 历时辰:戌 💐 (狗 🐞 时)
因此,2023 年 3 月 15 日 10:20 的八字农历为:丑年正 🦉 月十四日戌时 🐛 。
1. 获 🐼 取公历日期的年 🦄 、月 🐴 日、:
使用 🐴 `datetime` 模块中的 `datetime.datetime` 类获取当前或指 🌴 定 🐒 的公历日期。
提 🌸 取年 🌵 (`year`)、月 🐝 (`month`) 和日 (`day`)。
2. 计 🦢 算儒略日数 (JD):
使用以 🐋 下 🐧 公式计算儒略日数 🌵 :
JD = 367 year (7 (year + ((month + 9) // 12))) / 4 + (275 month) / 9 + day +
3. 计 🦟 算农历年月 (LY):
使 🐎 用以下公 🐱 式计算农历年 (`lyear`):
lyear = 444 + (JD ) // 365.2422
使用 🦊 以下公式计 🐘 算农历月 (`lmonth`):
lmonth = (JD ) / 29.53059
4. 计算农历 🪴 日 (LD):
获取农历年的干支年份 🌴 (GZ):使用 `ganzhi_year` 函数将农历年转换为干支 🍀 年份。
获取农历 🦍 年的节气表 (ST):使用 `jieqi_table` 函数获取农历年的节气表。
计算当 🐱 前日期在农历年的第几天:`d = JD + 1`
遍 🐱 历节气表,找 💮 到第一个大于或等于 `d` 的节气 🦟 ,并记录节气名 (`jieqi`)。
计 🐋 算农 🕷 历日:`LD = d (ST[jieqi]['date'] 1)`
5. 返回 🐺 农 🕸 历日期 🦊 :
组合农历年农历、月和农历日,使用以下格 🦍 式返回农历 🦋 日 🐈 期:
农历 🌹 {lyear}年 🐬 {lmonth}月{ld}日
示例代码:
python
import datetime
def gan_zhi_year(year):
"""
转换 🕊 公历 🌼 年 🌼 为干支年份
Args:
year (int): 公 🐅 历 🦅 年 💮
Returns:
str: 干 🌳 支年份 🌵
"""
gan_zhi = ['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛 🦁 ', '壬', '癸']
zhi = ['子', '丑 🐼 ', '寅 🦈 ', '卯 🦁 ', '辰', '巳', '午', '未', '申', '酉', '戌', '亥']
return gan_zhi[(year 4) % len(gan_zhi)] + zhi[(year 4) % len(zhi)]
def jieqi_table(year):
"""
获取农历年的 🍁 节气表 🦅
Args:
year (int): 公历 🦟 年 🐘
Returns:
dict: 节 🍁 气表 🍀
"""
jieqi_names = [
'小寒', '大寒', '立', '春', '雨', '水', '惊', '蛰',春分清 🦍 明 🐧 谷雨
'立夏', '小', '满 🦋 ', '芒', '种夏', '至', '小', '暑',大暑立秋处暑
'白露 🐯 ', '秋', '分', '寒露', '霜', '降', '立', '冬'小雪大雪冬至 🍁
]jieqi_dates = [
[20, 5], [3, 20], [4, 5], [19, 21], [5, 6], [20, 21], [4, 5], [20, 21],
[5, 6], [21, 23], [6, 6], [21, 22], [7, 8], [23, 23], [8, 8], [23, 23],
[7, 8], [23, 23], [8, 9], [23, 23], [7, 8], [22, 22], [6, 6], [22, 22]
]table = {name: {'date': date} for name, date in zip(jieqi_names, jieqi_dates)}
table['立春立 🐞 春 🌲 '][year 1] = [4, 5] 日期可能会跨 🦄 年
return table
def lunar_date(year, month, day):
"""
公历日期转换成农 🌷 历日期
Args:
year (int): 公 🦉 历 🐎 年 🦋
month (int): 公 🐱 历月
day (int): 公 🐛 历 🦈 日 🦟
Returns:
str: 农历 🐺 日 🐕 期 🦅
"""
jd = 367 year (7 (year + ((month + 9) // 12))) / 4 + (275 month) / 9 + day +
lyear = 444 + (jd ) // 365.2422
lmonth = (jd ) / 29.53059
d = jd + 1
st = jieqi_table(lyear)
for jieqi, date in st.items():
if d >= date['date']:
jieqi_name = jieqi
ld = d (st[jieqi_name]['date'] 1)
return f"农历{lyear}年{lmonth}月 🕊 {ld}日"
获取当前日期 🕷
today = datetime.datetime.today()
转换公历日期为农历 🕊 日期
lunar_date = lunar_date(today.year, today.month, today.day)
print(lunar_date)