一、简介

该算法从网上找到,将公历转成农历,只能计算1921年-2021年间的农历。只能显示 甲午年,生肖和农历,无法得到 庚午月、癸丑日。

二、函数

/*------------农历转换函数-----------*/

void Window::get_chinese_calendar(QDate english_calendar, QString &outLunarDay, QString &outLunarYear)
{
    int currentYear = 0, currentMonth = 0, currentDay = 0;
    int nTheDate = 0;
    int nisEnd = 0, flag = 0, n = 0, k = 0, nBit = 0, i = 0;
    char m_Lunar[100] = {0}, m_LunarDay[50] = {0}, m_zodiak[50] = {0};
    /*天干名称*/
    const char *m_TianGan[] = {"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};
    /*地支名称*/
    const char *m_DiZhi[] = {"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"};
    /*属相名称*/
    const char *m_ShuXiang[] = {"鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"};
    /*农历日期名*/
    const char *m_DayName[] = {"*","初一","初二","初三","初四","初五",
          "初六","初七","初八","初九","初十",
          "十一","十二","十三","十四","十五",
          "十六","十七","十八","十九","二十",
          "廿一","廿二","廿三","廿四","廿五",
          "廿六","廿七","廿八","廿九","三十"};
     /*农历月份名*/
    const char *m_MonthName[] = {"*","正","二","三","四","五","六","七","八","九","十","十一","腊"};
    /*公历每月前面的天数*/
    const int m_DayAdd[12] = {0,31,59,90,120,151,181,212,243,273,304,334};
    /*农历数据*/
    const int m_LunarData[100]= {2635,333387,1701,1748,267701,694,2391,133423,1175,396438
                                 ,3402,3749,331177,1453,694,201326,2350,465197,3221,3402
                                 ,400202,2901,1386,267611,605,2349,137515,2709,464533,1738
                                 ,2901,330421,1242,2651,199255,1323,529706,3733,1706,398762
                                 ,2741,1206,267438,2647,1318,204070,3477,461653,1386,2413
                                 ,330077,1197,2637,268877,3365,531109,2900,2922,398042,2395
                                 ,1179,267415,2635,661067,1701,1748,398772,2742,2391,330031
                                 ,1175,1611,200010,3749,527717,1452,2742,332397,2350,3222
                                 ,268949,3402,3493,133973,1386,464219,605,2349,334123,2709
                                 ,2890,267946,2773,592565,1210,2651,395863,1323,2707,265877};

currentYear = english_calendar.year();
    currentMonth = english_calendar.month();
    currentDay = english_calendar.day();
    /*---计算到初始时间1921年2月8日的天数:1921-2-8(正月初一)---*/
    nTheDate = (currentYear - 1921) *365 + (currentYear - 1921)/4  + m_DayAdd[currentMonth - 1] + currentDay - 31 - 7;
    if((!(currentYear % 4)) && (currentMonth > 2))
        nTheDate = nTheDate + 1;
    /*--计算农历天干、地支、月、日---*/
    nisEnd = 0;
    flag = 0;
    while (nisEnd != 1) {
        if (m_LunarData[flag] < 4095)  k = 11;
        else  k = 12;
        n = k;
        while (n >= 0) {
             //m_LunarData(flag)的第n个二进制位的值
            nBit = m_LunarData[flag];
            for (i = 1; i < n + 1; i++)  nBit = nBit / 2;
            nBit = nBit % 2;
            if (nTheDate <= (29 + nBit)) {
                nisEnd = 1;
                break;
            }
            nTheDate = nTheDate - 29 - nBit;
            n = n - 1;
        }
        if (nisEnd)  break;
        flag = flag + 1;
    }
    currentYear = 1921 + flag;
    currentMonth = k - n + 1;
    currentDay = nTheDate;
    if (k == 12) {
        if (currentMonth == m_LunarData[flag] / 65536 + 1)  currentMonth = 1 - currentMonth;
        else if (currentMonth > m_LunarData[flag] / 65536 + 1)  currentMonth = currentMonth - 1;
    }
    /*--生成农历天干、地支、属相*/
    sprintf(m_zodiak, "%s", m_ShuXiang[((currentYear - 4) % 60) % 12]);
    sprintf(m_Lunar, "%s%s年 【%s年】", m_TianGan[((currentYear - 4) % 60) % 10], m_DiZhi[((currentYear - 4) % 60) % 12], m_zodiak);
    /*--生成农历月、日*/
    if (currentMonth < 1)
        sprintf(m_LunarDay ,"闰%s", m_MonthName[-1 * currentMonth]);
    else
        strcpy(m_LunarDay, m_MonthName[currentMonth]);
    strcat(m_LunarDay,"月");
    strcat(m_LunarDay, m_DayName[currentDay]);

outLunarYear = tr(m_Lunar);
    outLunarDay = tr(m_LunarDay);
}

三、调用

QString m_LunarYear = "", m_LunarDay = "";

QDate date = QDate::currentDate();     //

get_chinese_calendar(date, m_LunarYear, m_LunarDay);

qDebug() << outLunarDay;
qDebug() << outLunarYear;

运行结果:

四、总结

(1)有研究该技术的好友可以提出更好的建议,sprintf(m_Lunar, "%s%s年 【%s年】", m_TianGan[((currentYear - 4) % 60) % 10], m_DiZhi[((currentYear - 4) % 60) % 12], m_zodiak);只能 得到甲午年,月日应该怎么计算了。

(2)该代码是程序的一部分。需要c++使用的可改QString为String,C的更简单将m_Lunar和m_LunarDay数组作为参数传递。

(3)若需要沟通可以联系yang.ao@i-soft.com.cn。

patch1:

(1)计算农历的月日:

char p_LunarMonth[50] = {0}, p_LunarDay[50] = {0};
int nTheMonth = (currentYear- 1921) * 12 - 2 + currentMonth;sprintf(p_LunarMonth, "%s%s月", m_TianGan[(nTheMonth + 6) % 10], m_DiZhi[(nTheMonth + 2) % 12]);
sprintf(p_LunarDay, "%s%s日", m_TianGan[(nTheDate + 7) % 10], m_DiZhi[(nTheDate + 1) % 12]);

输入结果为:

(2)还是不清楚农历数据const int m_LunarData[100]怎么获得的,符合什么规则。有明白的可以推荐讲解。

公历转农历的程序(代码转载于网络)相关推荐

  1. 公历转农历C/C++代码

    ** **公历转农历C/C++的实现 ** 本实现的算法,主要来自网络和加入自己的需要完善而来,有同样需要的人可以参考一下: 联系:domics.cn 用法: 备注:此文件是visual studio ...

  2. C++:公历转农历的程序

    一.简介 该算法从网上找到,将公历转成农历,只能计算1921年-2021年间的农历.只能显示 甲午年,生肖和农历,无法得到 庚午月.癸丑日. 二.函数 void Window::get_chinese ...

  3. 万年历加农历的程序代码c语言,C语言万年历的源程序

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 for(j=1;j<=mon[i];j++) {cprintf("%3d ",j); /*if((first+j-1)%7==0 ...

  4. c语言实现 网络嗅探程序代码,一个简易网络嗅探器的实现源代码.doc

    一个简易网络嗅探器的实现源代码 摘要:本文介绍一个用C语言和网络数据包分析开发工具实现的简易网络Sniffer. 要害词:网络:数据包:Sniffer 引言 目前,已经有不少的Sniff工具软件,如W ...

  5. 公历转农历matlab,公历转农历

    从网上找到一个公历转农历的程序.用途可能不是太广泛,但: A需要的时候去编写,还是蛮难的,B:编程方法可供参考. 从这个网址拷贝过来的http://top99.blog.hexun.com/45657 ...

  6. 自学Matlab必备的60个小程序代码

    自学Matlab必备的60个小程序代码 转载自:http://ishare.iask.sina.com.cn/f/9253907.html

  7. 公历转农历、生肖、干支纪年、节气算法研究和C程序实现

    [本文发布于https://blog.csdn.net/Stack_/article/details/119980697,未经许可不得转载,转载须注明出处] 一.参考文章 阳历转阴历算法概述 1900 ...

  8. 公历转农历linux C程序

    该代码实现根据公历日期查询农历日期,和24节气,假期,干支年份,干支月份等. 改代码是根据以下两个代码改编而来,感谢两位的共享精神. http://blog.jjonline.cn/userInter ...

  9. 一款公历转农历节气以及天干地支的js代码

    最近用到公历转农历,节气,天干地支的JavaScript代码.公历转节气可以计算法,能精确到时辰.如果只要精确到日也可以用查表法.然后农历涉及到闰月的计算.年和日的天干地支计算比较简单,但月份要根据节 ...

  10. 51单片机农历转换公历c语言算法,C51写的51单片机用公历转农历和星期程序

    点击此处下载 ourdev_615042D2O2A7.pdf(文件大小:154K) (原文件名:公历与农历日期的转换.pdf) #define uchar unsigned char #define ...

最新文章

  1. windows2003server下能安装的MSN
  2. 和与余数的和同余理解_每日一题 | 第38期:数量关系之余数特性
  3. C++多继承(多重继承)详解(二)命名冲突
  4. .frm_.myd_myi转换为.sql导入mysql数据库_把.frm,.myd,myi转换为.sql导入数据库
  5. MyBatis——insert错误[Could not set property ‘id‘ of ‘class‘ with value ‘xxx‘]解决方案
  6. 在SAP ABAP 里consume webservice的全过程
  7. (XGBoost)提升树入门介绍(Inrtoduction to Boosted Trees)
  8. NKOJ2317 英语四六级考试
  9. CentOS7安装后没网络的解决方法
  10. eval函数python原理_Python 中 eval 函数的神奇用法
  11. java程序员工资调查_程序员真实调查,工资真的高吗?
  12. 超简单的vim配置高亮
  13. 京东CEO刘强东事件在发酵,谎言终被破
  14. Lab1实验过程及心得体会
  15. Creo模型装配总结
  16. matlab2016 新建m文件,matlab2016a关联m文件
  17. 水星无线网卡支持linux吗,ubuntu下使用水星MecuryUD13H无线网卡问题
  18. SAS学习6(freq过程、tabulate过程、univariate过程、plot过程、chart过程)
  19. 【houdini vex】Point Deform
  20. git push 报错 ---error: commit 8aa8e31: email address yin.jiaqing@.....com is not registered in your

热门文章

  1. 06 Redis中BigKey、HotKey的发现与处理
  2. package.json bin的作用
  3. 关于xmind6图标组导入教程
  4. Redhat_rhel8.0_FTP服务配置
  5. Vscode配置C++(一步一步图文详解)
  6. linux 下的无线网络配置,详解在LINUX环境下怎样设置无线网络配置
  7. python中使用ffmpeg合并音频与视频_FFMpeg无损合并视频的多种方法
  8. 大疆御2电池数据查看教程
  9. C语言学习-- 计算机原理及二进制
  10. 爬虫需谨慎,你不知道的爬虫与反爬虫套路!