农历转换函数(C语言版)

发布者:chwwdch最新更新时间:2014-12-26 来源: 51hei关键字:农历  转换函数  C语言 手机看文章 扫描二维码
随时随地手机看文章

char *GetDayOf(PSYSTEMTIME pSt)

{
/*天干名称*/
const char *cTianGan[] = {"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};
/*地支名称*/
const char *cDiZhi[] = {"子","丑","寅","卯","辰","巳","午",
"未","申","酉","戌","亥"};
/*属相名称*/
const char *cShuXiang[] = {"鼠","牛","虎","兔","龙","蛇",
"马","羊","猴","鸡","狗","猪"};
/*农历日期名*/
const char *cDayName[] = {"*","初一","初二","初三","初四","初五",
"初六","初七","初八","初九","初十",
"十一","十二","十三","十四","十五",
"十六","十七","十八","十九","二十",
"廿一","廿二","廿三","廿四","廿五",
"廿六","廿七","廿八","廿九","三十"};
/*农历月份名*/
const char *cMonName[] = {"*","正","二","三","四","五","六",
"七","八","九","十","十一","腊"};
 
/*公历每月前面的天数*/
const int wMonthAdd[12] = {0,31,59,90,120,151,181,212,243,273,304,334};
/*农历数据*/
const int wNongliData[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};
static int wCurYear,wCurMonth,wCurDay;
static int nTheDate,nIsEnd,m,k,n,i,nBit;
TCHAR szNongli[30], szNongliDay[10],szShuXiang[10];
/*---取当前公历年、月、日---*/
wCurYear = pSt->wYear;
wCurMonth = pSt->wMonth;
wCurDay = pSt->wDay;
/*---计算到初始时间1921年2月8日的天数:1921-2-8(正月初一)---*/
nTheDate = (wCurYear - 1921) * 365 + (wCurYear - 1921) / 4 + wCurDay + wMonthAdd
[wCurMonth - 1] - 38;
if((!(wCurYear % 4)) && (wCurMonth > 2))
nTheDate = nTheDate + 1;
 
/*--计算农历天干、地支、月、日---*/
nIsEnd = 0;
m = 0;
while(nIsEnd != 1)
{
if(wNongliData[m] < 4095)
k = 11;
else
k = 12;
n = k;
while(n>=0)
{
//获取wNongliData(m)的第n个二进制位的值
nBit = wNongliData[m];
for(i=1;inBit = nBit/2;
 
nBit = nBit % 2;
 
if (nTheDate <= (29 + nBit))
{
nIsEnd = 1;
break;
}
 
nTheDate = nTheDate - 29 - nBit;
n = n - 1;
}
if(nIsEnd)
break;
m = m + 1;
}
wCurYear = 1921 + m;
wCurMonth = k - n + 1;
wCurDay = nTheDate;
if (k == 12)
{
if (wCurMonth == wNongliData[m] / 65536 + 1)
wCurMonth = 1 - wCurMonth;
else if (wCurMonth > wNongliData[m] / 65536 + 1)
wCurMonth = wCurMonth - 1;
}
 
/*--生成农历天干、地支、属相 ==> wNongli--*/
wsprintf(szShuXiang,"%s",cShuXiang[((wCurYear - 4) % 60) % 12]);
wsprintf(szNongli,"%s(%s%s)年",szShuXiang,cTianGan[((wCurYear - 4) % 60) %
10],cDiZhi[((wCurYear - 4) % 60) % 12]);
 
/*--生成农历月、日 ==> wNongliDay--*/
if (wCurMonth < 1)
wsprintf(szNongliDay,"闰%s",cMonName[-1 * wCurMonth]);
else
strcpy(szNongliDay,cMonName[wCurMonth]);
 
strcat(szNongliDay,"月");
strcat(szNongliDay,cDayName[wCurDay]);
return strcat(szNongli,szNongliDay);
 
}

 

关键字:农历  转换函数  C语言 引用地址:农历转换函数(C语言版)

上一篇:C语言根据日期判断星期几(使用基姆拉尔森计算公式)
下一篇:MSP430 IAR如何生HEX文件

推荐阅读最新更新时间:2024-03-16 13:49

stm32 编程的收获,有关C语言(在stm32 公交报站中的收获)
1. char * msg = { //以下内容请自行修改 { 乘客您好,欢迎乘坐 }, { 2 路 }, //车次,采用单个数字变读(1读作幺)模式,读后恢复正常模式 { 公交车,本路车由 }, { 开往 }, { ,前门上车,后门下车,本车无人售票,请自备零钱 }, { 车辆起动,请站稳扶好 }, { 车辆转弯,请注意安全 }, { 前方到站 }, { 下车的乘客后门请 }, { 车站到了,请您带好随身物品,从后门下车,谢谢您的乘坐,再见 }, { 始发站 }, { 终点站 }, { soundk }, { 到了 } }; 指针数组:指针的数组。 在字符串定义的时候使用指针; 调用的时候 v
[单片机]
C语言基础知识科普
C语言是单片机开发中的必备基础知识,本文列举了部分STM32学习中比较常见的一些C语言基础知识。 1 位操作 下面我们先讲解几种位操作符,然后讲解位操作使用技巧。C语言支持以下六种位操作:79c55d0c-080b-11ed-ba43-dac502259ad0.png 下面,重点讲解一下位操作在单片机开发中的一些实用技巧。1.1 在不改变其他位的值的状况下,对某几个位进行设值 这个场景在单片机开发中经常使用,方法就是我们先对需要设置的位用&操作符进行清零操作,然后用 | 操作符设值。 比如,我要改变GPIOA的状态,可以先对寄存器的值进行&清零操作:79dc505c-080b-11ed-ba43-dac5
[单片机]
详解C语言字节对齐
  一、什么是对齐,以及为什么要对齐:   1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。   2. 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台的要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为 32位)如果存放在偶地址开始的地方,
[单片机]
如何写出高效的单片机C语言程序代码
由于单片机的性能同电脑的性能是天渊之别的,无论从空间资源上、内存资源、工作频率,都是无法 与之比较的。PC 机编程基本上不用考虑空间的占用、内存的占用的问题,最终目的就是实现功能就可以了。 对于单片机来说就截然不同了,一般的单片机的Flash 和Ram 的资源是以KB 来衡量的,可想而知,单片 机的资源是少得可怜,为此我们必须想法设法榨尽其所有资源,将它的性能发挥到最佳,程序设计时必须 遵循以下几点进行优化: 1. 使用尽量小的数据类型 能够使用字符型(char)定义的变量,就不要使用整型(int)变量来定义;能够使用整型变量定义的变 量就不要用长整型(long int),能不使用浮点型(float)变量就不要使用浮点型变量。当然
[单片机]
51单片机连接24C02-C语言测试代码
我总结3点需要注意的地方 1.关闭非IIC通信器件,比如我的开发板SDA和SCL也连接了DS1302,造成干扰会没有结果。 2.IIC通信的应答,发送端在SCL为0时将SDA置1,等待接收端拉低SDA;接收端在拉低SDA持续一个周期后,应将SDA置1释放总线。 主机作为发送端等待应答 SDA=1; SCL=1; while(SDA); SCL=0; 主机作为接收端,进行应答或不应答 SDA=0; //不应答则为1 SCL=1; SCL=0; SDA=1; 3.24C02在写入周期完成后还有有内部写入时间Twr,所以可以查手册加入适当时间的延时函数,或者使用查询应答的方式进行延时等待。 总之,关键是注意
[单片机]
C语言中关键字volatile追根问底
volatile 的英文解释是——“易失的,易改变的”。顾名思义,这个关键字的含义是向编译器指明变量的内容可能会由于编译器意想不到的情况的变化而发生变化。这个解释仍然比较抽象,感兴趣的可以继续阅读下面内容。 先看一下编译器对程序的优化过程是怎么进行的 如果编译器在代码中发现对同一地址的两次访问之间,没有对该地址进行写操作,那么编译器的优化过程认为——第一次寻址读取该地址时取得的变量的值(编译器会尽最大可能把这个值存放在通用寄存器R中或者cache中)作为第二次寻址的值,而并不是再做第二次内存的 I/O 寻址操作(当CPU把该变量的值放到通用寄存器或者cache中中后就不会再关心对应内存中的值)。 例如: int i = 10;
[单片机]
Proteus仿真51单片机C语言程序实例-开关控制报警器
简介:51单片机C语言程序实例-开关控制报警器(用K1开关控制报警器,程序控制P1.0输出两种不同频率的声音,模拟很逼真的报警效果)。
[单片机]
Proteus仿真51单片机<font color='red'>C语言</font>程序实例-开关控制报警器
单片机c语言教程:C51运算符和表达式(指针和地址运算符)
我们学习数据类型时,学习过指针类型,知道它是一种存放指向另一个数据的地址的变量类型。指针是单片机C语言中一个十分重要的概念,也是学习单片机C语言中的一个难点。对于指针将会在第九课中做详细的讲解。在这里我们先来了解一下单片机C语言中供给的两个专门用于指针和地址的运算符: * 取内容 & 取地址取内容和地址的一般形式分别为: 变量 = * 指针变量 指针变量 = & 目标变量 取内容运算是将指针变量所指向的目标变量的值赋给左边的变量;取地址运算是将目标变量的地址赋给左边的变量。要注意的是:指针变量中只能存放地址(也就是指针型数据), 一般情况下不要将非指针类型的数据赋值给一个指针变量。 下面来看一个例子,并用一个图表和实
[单片机]
单片机<font color='red'>c语言</font>教程:C51运算符和表达式(指针和地址运算符)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved