news 2026/4/23 19:21:10

别再手动算黄历了!用Python的sxtwl库,5分钟搞定农历、节气、八字查询

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再手动算黄历了!用Python的sxtwl库,5分钟搞定农历、节气、八字查询

用Python解放传统历法查询:sxtwl库实战指南

每次家里老人问起"下个月初八是阳历几号"或是朋友好奇"我生日那天的节气是什么",你是否还在手动翻黄历或打开一堆网页查询?作为开发者,我们完全可以用代码优雅解决这些问题。sxtwl这个Python库,正是传统历法计算的瑞士军刀。

1. 环境配置与基础认知

安装只需一行命令:

pip install sxtwl==2.0.6

这个库最惊艳之处在于它完整封装了中国传统历法的核心要素:

  • 阴阳历转换:公历与农历的无缝互转
  • 节气计算:精确到分钟的二十四节气查询
  • 干支系统:年柱、月柱、日柱、时柱的自动生成
  • 特殊日期:闰月、月相、星座等衍生数据

提示:该库数据精度覆盖公元前2000年至公元2100年,完全满足日常使用需求

传统历法查询的复杂性主要来自三个维度:

  1. 阴阳历转换的非线性规则(如闰月设置)
  2. 节气计算的天文算法(太阳黄经计算)
  3. 干支系统的循环规则(60甲子周期)

2. 核心功能实战演示

2.1 阴阳历互转的精确实现

获取今日农历信息的典型操作:

import sxtwl # 公历转农历 day = sxtwl.fromSolar(2023, 7, 15) lunar_date = f"{day.getLunarYear()}年{'闰' if day.isLunarLeap() else ''}{day.getLunarMonth()}月{day.getLunarDay()}日" print(f"今日农历:{lunar_date}") # 农历转公历示例 qixi_day = sxtwl.fromLunar(2023, 7, 7) # 2023七夕 print(f"今年七夕是公历{qixi_day.getSolarYear()}年{qixi_day.getSolarMonth()}月{qixi_day.getSolarDay()}日")

日期推算同样简单:

# 查询春节后第100天的公历日期 spring_festival = sxtwl.fromLunar(2023, 1, 1) day_100 = spring_festival.after(100) print("春节后第100天是:", day_100.getSolarDate())

2.2 节气查询与提醒系统

自动检测节气日的实用方法:

def get_jieqi(year, month, day): day_obj = sxtwl.fromSolar(year, month, day) if day_obj.hasJieQi(): jd = day_obj.getJieQiJD() # 获取儒略日 precise_time = sxtwl.JD2DD(jd) # 转换为日期时间 return f"{jqmc[day_obj.getJieQi()]} {precise_time.h}:{precise_time.m}" return "当日无节气" # 示例:查询2023年冬至精确时刻 print(get_jieqi(2023, 12, 22)) # 输出:冬至 17:27

节气提醒系统的核心逻辑可以这样构建:

# 获取未来30天内所有节气 current = sxtwl.fromSolar(2023, 7, 1) for _ in range(30): current = current.after(1) if current.hasJieQi(): print(f"提醒:{current.getSolarDate()}将迎来{jqmc[current.getJieQi()]}")

2.3 生辰八字计算器

完整的八字计算函数示例:

def calculate_bazi(year, month, day, hour): day_obj = sxtwl.fromSolar(year, month, day) # 年柱(默认立春分界) year_gz = day_obj.getYearGZ(False) # 月柱 month_gz = day_obj.getMonthGZ() # 日柱 day_gz = day_obj.getDayGZ() # 时柱 hour_gz = day_obj.getHourGZ(hour) return ( f"年柱:{Gan[year_gz.tg]}{Zhi[year_gz.dz]}", f"月柱:{Gan[month_gz.tg]}{Zhi[month_gz.dz]}", f"日柱:{Gan[day_gz.tg]}{Zhi[day_gz.dz]}", f"时柱:{Gan[hour_gz.tg]}{Zhi[hour_gz.dz]}" ) # 示例:计算2023年7月15日15时的八字 print(calculate_bazi(2023, 7, 15, 15))

3. 实用工具开发思路

3.1 命令行黄历工具

基于Click库构建的命令行应用框架:

import click @click.command() @click.option('--date', default='today', help='查询日期(格式:YYYY-MM-DD)') def cli_calendar(date): if date == 'today': from datetime import datetime today = datetime.now() year, month, day = today.year, today.month, today.day else: year, month, day = map(int, date.split('-')) day_info = sxtwl.fromSolar(year, month, day) # 输出完整信息 click.echo(f"公历:{year}年{month}月{day}日") click.echo(f"农历:{day_info.getLunarYear()}年{day_info.getLunarMonth()}月{day_info.getLunarDay()}日") click.echo(f"星期:{WeekCn[day_info.getWeek()]}") if day_info.hasJieQi(): click.echo(f"节气:{jqmc[day_info.getJieQi()]}") if __name__ == '__main__': cli_calendar()

3.2 微信节气提醒机器人

结合企业微信API的定时提醒服务:

import requests from datetime import datetime def send_wechat_alert(message): url = "https://qyapi.weixin.com/xxx/send" payload = { "msgtype": "text", "text": {"content": message} } requests.post(url, json=payload) def check_jieqi(): today = datetime.now() day_obj = sxtwl.fromSolar(today.year, today.month, today.day) if day_obj.hasJieQi(): jieqi_name = jqmc[day_obj.getJieQi()] send_wechat_alert(f"今日{datetime.now().month}月{datetime.now().day}日是{jieqi_name}节气") # 添加到定时任务(每天8点运行)

4. 进阶应用与性能优化

4.1 批量日期处理技巧

处理大量日期查询时,可以复用day对象提升性能:

# 高效查询连续日期 start_day = sxtwl.fromSolar(2023, 1, 1) results = [] for _ in range(365): lunar_month = start_day.getLunarMonth() lunar_day = start_day.getLunarDay() # 记录所有农历初一 if lunar_day == 1: results.append(start_day.getSolarDate()) start_day = start_day.after(1) print(f"2023年共有{len(results)}个农历初一")

4.2 自定义节日提醒系统

结合农历日期实现节日提醒:

festivals = { (1, 1): "春节", (5, 5): "端午节", (8, 15): "中秋节" } def get_festival_reminders(year): reminders = [] for (month, day), name in festivals.items(): lunar_day = sxtwl.fromLunar(year, month, day) solar_date = lunar_day.getSolarDate() reminders.append(f"{name}:{solar_date}") return reminders # 获取2024年传统节日公历日期 for reminder in get_festival_reminders(2024): print(reminder)

4.3 数据库集成方案

将历法数据存入SQLite的实用代码:

import sqlite3 def create_calendar_db(year_range): conn = sqlite3.connect('chinese_calendar.db') c = conn.cursor() c.execute('''CREATE TABLE IF NOT EXISTS calendar (solar_date TEXT PRIMARY KEY, lunar_date TEXT, jieqi TEXT)''') start_year, end_year = year_range current = sxtwl.fromSolar(start_year, 1, 1) while current.getSolarYear() <= end_year: jieqi = jqmc[current.getJieQi()] if current.hasJieQi() else None c.execute("INSERT INTO calendar VALUES (?, ?, ?)", (current.getSolarDate(), f"{current.getLunarMonth()}月{current.getLunarDay()}日", jieqi)) current = current.after(1) conn.commit() conn.close() # 创建2020-2030年的历法数据库 create_calendar_db((2020, 2030))
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 19:21:10

竹飞N30电机取名那点事儿,误会大了!

关于逐飞N30电机取名带来的“误会”逐飞的N30陷阱 N30电机取名的那点事01 【N30电机取名那点事】 哈喽宝子们&#xff0c;今儿咱唠唠竹飞N30电机那点糟心事儿&#xff0c; 简直是平地起波澜&#xff0c;纯属一场美丽的误会&#xff0c; 弄的咱又好气又好笑&#xff0c; 我了个老…

作者头像 李华
网站建设 2026/4/23 19:20:21

如何利用HTTrack实现网站完整离线备份:从零开始的终极指南

如何利用HTTrack实现网站完整离线备份&#xff1a;从零开始的终极指南 【免费下载链接】httrack HTTrack Website Copier, copy websites to your computer (Official repository) 项目地址: https://gitcode.com/gh_mirrors/ht/httrack 你是否曾遇到过这样的困境&#…

作者头像 李华
网站建设 2026/4/23 19:16:39

机器人应用-高空立面清洁

随着城市化推进&#xff0c;城市中高层建筑幕墙、公共空间设施等外立面的清洁维护 长期面临着三大难题&#xff1a;人工高空作业安全风险高、效率低且难以处理复杂和异形 作业场景、综合作业成本高。 高空立面清洗系统通过整合无人机智能清洗机器人水处理系统&#xff0c;可颠覆…

作者头像 李华