本帖最后由 dscao 于 2016-1-18 13:58 编辑
公历转换农历的函数代码,来源于网络上的。但如果直接copy,手表的os对有些函数或参数不支持,造成安装后消失的情况。可能这点也阻碍其它同学未完成此代码的原因,我采用一行一行加入测试的方法,所以耗费了相当多的时间,才找到问题的具体代码行,再替换相应的代码来解决的。
代码如下,应该还有很大的优化空间。
- /*------------农历转换函数-----------*/
- char *DayToNL(int year, int month,int day)
- {
- /*天干名称*/
- char cTianGan[10][4] = {"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};
- /*地支名称*/
- char cDiZhi[12][4] = {"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"};
- /*属相名称*/
- char cShuXiang[12][4] = {"鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"};
- /*农历日期名*/
- char cDayName[31][8] = {"*","初一","初二","初三","初四","初五",
- "初六","初七","初八","初九","初十",
- "十一","十二","十三","十四","十五",
- "十六","十七","十八","十九","二十",
- "廿一","廿二","廿三","廿四","廿五",
- "廿六","廿七","廿八","廿九","三十"};
- /*农历月份名*/
- char cMonName[13][4] = {"*","正","二","三","四","五","六","七","八","九","十","冬","腊"};
- /*公历每月前面的天数*/
- int wMonthAdd[12] = {0,31,59,90,120,151,181,212,243,273,304,334};
- /*农历数据——1921至2020年有效,这一块我没搞懂怎么算出来的,想加上2021-2050年的数据但没加上,或者只要2016-2020年的数据,但没完全懂没敢删除前面的。算法的理解上对农历月日方面没太理解过来,主要是润月、大月、小月问题*/
- 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};
- int wCurYear,wCurMonth,wCurDay;
- int nTheDate,nIsEnd,m,k,n,i,nBit;
- /*char *szNongli = malloc(24); 原来用这个的可行,后来说怕耖尽内存改为下一句。*/
复制代码- /*接上面,网站这里代码段可能是长度限制,全部放一起就被截断了。*/
- static char szNongli[24] = "";
复制代码 发现一句被截断的,想补上来。结果一提交,这一句上去了,一大段又被截掉了。再接一块。- char szNongliDay[10] = "";
- char szShuXiang[10] = "";
- /*---取当前公历年、月、日---*/
- wCurYear = year;
- wCurMonth = month;
- wCurDay = day;
- /*---计算到初始时间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;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;
- 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--*/
- sprintf(szShuXiang,"%s",cShuXiang[((wCurYear - 4) % 60) % 12]);
- sprintf(szNongli,"%s(%s%s)年",szShuXiang,cTianGan[((wCurYear - 4) % 60) % 10],cDiZhi[((wCurYear - 4) % 60) % 12]);
- /*--生成农历月、日 ==> wNongliDay--*/
- if (wCurMonth < 1)
- sprintf(szNongliDay,"闰%s",cMonName[-1 * wCurMonth]);
- else
- strcpy(szNongliDay,cMonName[wCurMonth]);
- sprintf(szNongli,"%s%s月%s" ,szNongli,szNongliDay, cDayName[wCurDay]); //可修改成不同形式输出。
- return szNongli;
- }
复制代码
调用方法:DayToNL(t.year, t.mon,t.mday)
示例:- struct date_time t;
- app_service_get_datetime(&t);
复制代码- /*添加农历图层*/
- GRect frame_nlday = {{MWD_NLDAY_ORIGIN_X, MWD_NLDAY_ORIGIN_Y}, {MWD_NLDAY_SIZE_H, MWD_NLDAY_SIZE_W}};
- LayerText lt_nlday = { DayToNL(t.year, t.mon,t.mday), frame_nlday, GAlignCenter, U_GBK_SIMSUN_12, 0};
- P_Layer layer_text_nlday = app_layer_create_text(<_nlday);
- if(layer_text_nlday != NULL)
- {
- app_layer_set_bg_color(layer_text_nlday, GColorBlack);
- g_app_mwd_nlday_layer_id = app_window_add_layer(p_window, layer_text_nlday);
- }
复制代码
农历这一段编译后占用的大小可能有5~6KB。这里抛砖引玉,希望有同学能做一些优化或改进。或者也有另外思路的更好实现方法。
希望麦步手表功能越来越强大,有更多实用的表盘或应用出现。
感谢支持.txt.rar
(10 Bytes, 下载次数: 10, 售价: 1 麦力)
附件无内容
|