C#下的一个好用的日历库(sxtwl_cpp),支持农历转公历,和公历转农历等功能

本文介绍了一个名为sxtwl_cpp的C++库,该库为寿星天文历提供了实现,并支持多种语言绑定。文章详细展示了如何在.NET环境中配置和使用此库,包括添加引用、复制dll文件以及通过示例代码演示其功能,如计算节气、干支纪年等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sxtwl_cpp是寿星天文历的C++版本实现。支持多种语言的绑定

代码首页

懒人包

懒人包使用方法

1、右链工程中的引用-》添加引用-》浏览-》选中dotnet目录下的sxtwl.net.dll

2、生成解决方案-》找生成解决方案有exe目录下,将bin目录下dll拷贝过去(建议使用win32的dll, x64的DLL可能跑不起来)

功能代码演示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace sxtwl_csharp
{
    class Program
    {
        string[] Gan = { "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸" };
        string[] Zhi = { "子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥" };
        string[] ShX = { "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪" };
        string[] numCn = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十" }; //中文数字
        string[] jqmc = { "冬至", "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪" };
        string[] ymc = { "十一", "十二", "正", "二", "三", "四", "五", "六", "七", "八", "九", "十" }; //月名称,建寅
        string[] rmc = { "初一", "初二", "初三", "初四", "初五", "初六", "初七", "初八", "初九", "初十", "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十", "廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "三十", "卅一" };

        private void log(String str)
        {
            System.Console.WriteLine(str);
        }


        private void printDay(Day day)
        {
            log("===================================================");
            log("公历:" + day.y + "年" + (int)day.m + "月" + day.d + "日");

            if (day.Lleap)//是否是阴历润月
            {
                log("农历:" +  "润"  + (day.Lyear0 + 1984) + "年" + ymc[day.Lmc] + "月" + rmc[day.Ldi] + "日");
            }
            else
            {
                log("农历:" + "润" + (day.Lyear0 + 1984) + "年" +   ymc[day.Lmc] + "月" + rmc[day.Ldi] + "日");
            }

            log("儒略历:JD" + sxtwl.J2000 + day.d0);
            log("星期" + numCn[day.week]);

            log("天干:" + Gan[day.Lyear2.tg] + Zhi[day.Lyear2.dz] + "年"
                    + Gan[day.Lmonth2.tg] + Zhi[day.Lmonth2.dz] + "月"
                    + Gan[day.Lday2.tg] + Zhi[day.Lday2.dz] + "日"
            );

            if (day.qk >= 0)
            {
                log("当日节气:" + jqmc[day.jqmc]);
                log("节气时间:" + day.jqsj);
            }

            //day.getXiZ();   //这个是星座

            log("距冬至" + day.cur_dz + "天");
            log("距夏至" + day.cur_xz + "天");
            log("距立秋" + day.cur_lq + "天");
            log("距芒种" + day.cur_mz + "天");
            log("距小暑" + day.cur_xs + "天");
        }


        private void testLunar()
        {
            Lunar lunar = new Lunar();

            //查询某月的月份信息(如:查2017年10月份)
            Month month = lunar.yueLiCalc(2017, 10);
            //年生肖
            log(month.y + "年:" + ShX[month.ShX]);
            //年天干地支
            log("天干:" + Gan[month.yearGan] + Zhi[month.yearZhi]);
            //当月的所有的日信息

            for (int i = 0; i < month.days.Count; ++i)
            {
                Day tmpDay = month.days[i];
                printDay(tmpDay);
            }


            //获取某个阳历日的信息(可在信息中查询到阴历,天干等)
            Day day = lunar.getDayBySolar(2018, 10, 1);
            printDay(day);

            //获取某个阴历日的信息(可在信息中查询到阳历,天干等)
            Day day2 = lunar.getDayByLunar(2018, 10, 1);
            printDay(day2);

            //获取时辰上的那个天干(例如拿下午13点的时辰干支)
            GZ gz = lunar.getShiGz(day.Lday2.tg, 13);
            log("获取时辰的干支:" + Gan[gz.tg] + Zhi[gz.dz]);

            //获取一年的信息(干支,生肖,)
            Year year = lunar.getYearCal(2018);
            log("获取年的干支:" + Gan[year.yearGan] + Zhi[year.yearZhi]);
            log("获取年的生肖:" + ShX[year.ShX]);
        }

        static void Main(string[] args)
        {

            new Program().testLunar();
            System.Console.ReadKey();
        }
    }
}

微信交流群

若失效,请邮件至:lifulinghan@aol.com 索要新的二维码

转载于:https://my.oschina.net/jjyuangu/blog/2120795

<think>嗯,用户想用lunar_python库把当前时间换成农历日期。首先我需要回忆一下这个库的使用方法。根据引用里的内容,比如引用[2]引用[4],里面提到了使用SolarLunar类。用户给的例子是从公历日期创建Solar对象,然后调用get_lunar()方法得到农历日期。 那我得先导入必要的库,比如lunar_python的SolarLunar。不过用户需要的是当前时间,所以可能需要用datetime模块获取当前日期,然后用Solar来初始化。或者可能Solar有直接获取当前时间的方法?比如Solar.fromDate(datetime.now())之类的?或者直接取当前时间的年、月、日,传给Solar构造函数。 根据引用[2]的例子,他们是这样写的: solar = Solar(2023, 10, 1) lunar = solar.get_lunar() 所以步骤应该是:获取当前时间的年、月、日,创建Solar实例,然后调用get_lunar()得到对应的农历日期。 然后输出的时候,可能需要用lunar的to_full_string()方法,或者提取年、月、日的属性。例如,引用[2]中的例子打印了lunar.to_full_string(),输出应该是详细的农历日期,包括闰月等信息。 另外,引用[4]提到Lunar Python支持公历农历,所以应该没问题。需要注意的是,是否需要处理时区问题?但用户可能只需要当前本地时间,所以用datetime.now()应该足够。 然后代码的大致步骤是: 1. 导入Solardatetime。 2. 获取当前时间的年、月、日。 3. 创建Solar对象。 4. 调用get_lunar()得到Lunar对象。 5. 格式化输出农历日期。 测试一下是否正确,比如当前日期是否换正确。如果有闰月的话,是否能显示出来?比如农历月份可能会带有闰字,比如“闰四月”。 然后用户可能需要农历日期的详细表示,比如包含年、月、日、是否闰月等。所以代码中可能需要访问Lunar对象的属性,如lunar.year, lunar.month, lunar.day,以及是否有闰月的信息,比如lunar.is_leap_month? 或者可能to_full_string()方法已经包含了这些信息。例如引用[2]中的例子输出农历日期的完整字符串,可能类似“农历二零二三年九月初一”这样的格式。 所以最终的代码可能是: from lunar_python import Solar, Lunar from datetime import datetime # 获取当前时间 now = datetime.now() # 创建Solar对象 solar = Solar(now.year, now.month, now.day) # 换为农历 lunar = solar.get_lunar() # 输出结果 print(f"当前公历时间: {now.strftime('%Y-%m-%d')}") print(f"对应农历日期: {lunar.to_full_string()}") 或者是否需要处理时间部分?比如当前时间的小时、分钟是否会影响农历日期的换?一般来说,农历日期的换可能只关注年月日,所以时间部分可能无关紧要。但可能需要确认。 另外,引用[3]提到了sxtwl库,但用户明确要的是lunar_python,所以应该忽略这部分。引用[5]提到zhdate的问题,但这里不用考虑。 最后,确保代码正确,比如Solar的参数是否正确,是否需要传入时分秒?根据文档,Solar可能只需要年月日。所以没问题。 总结步骤:导入库,获取当前日期,创建Solar实例,换为Lunar,输出结果。这样就能满足用户的需求了。</think>### 分步解答 以下是使用 `lunar_python` 库将当前时间换为农历日期的步骤: --- #### **1. 安装 `lunar_python` 库** 在终端中运行以下命令安装库: ```bash pip install lunar-python ``` --- #### **2. 导入必要模块** ```python from lunar_python import Solar, Lunar from datetime import datetime ``` --- #### **3. 获取当前公历时间** 使用 `datetime` 模块获取当前时间: ```python now = datetime.now() ``` --- #### **4. 创建公历日期对象** 将当前时间换为 `Solar` 对象: ```python solar_date = Solar(now.year, now.month, now.day) ``` --- #### **5. 换为农历日期** 调用 `get_lunar()` 方法获取农历日期对象: ```python lunar_date = solar_date.get_lunar() ``` --- #### **6. 输出农历日期** 通过 `to_full_string()` 方法格式化农历日期: ```python print(f"当前公历时间: {now.strftime('%Y-%m-%d')}") print(f"对应农历日期: {lunar_date.to_full_string()}") ``` --- #### **完整代码示例** ```python from lunar_python import Solar, Lunar from datetime import datetime # 获取当前公历时间 now = datetime.now() # 创建公历对象 solar_date = Solar(now.year, now.month, now.day) # 换为农历日期 lunar_date = solar_date.get_lunar() # 输出结果 print(f"当前公历时间: {now.strftime('%Y-%m-%d')}") print(f"对应农历日期: {lunar_date.to_full_string()}") ``` --- #### **代码说明** - `Solar` 类用于表示公历日期,通过 `Solar(year, month, day)` 构造。 - `get_lunar()` 方法将公历日期换为 `Lunar` 对象,包含农历的年、月、日、闰月等信息。 - `to_full_string()` 方法返回完整的农历字符串(例如:`农历二零二三年闰二月初一`)[^2][^4]。 --- #### **其他功能** - **农历公历**:通过 `Lunar(year, month, day, is_leap_month).get_solar()` 实现反向换。 - **节气与节假日**:使用 `lunar_date.get_jie_qi()` 或 `lunar_date.get_festivals()` 获取节气或节日信息[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值