麦步社区-论坛

标题: 公历转农历代码,到2100年 [打印本页]

作者: ensb1234    时间: 2019-9-23 22:27
标题: 公历转农历代码,到2100年
没学过c,写起来真难。这个农历数据是从js版转过来的,手表上测试过了应该没问题
农历年份对应真实的农历年份,比如2019年1月是属于农历的2018
闰月的话输出后会大于12,减掉12就是置闰的那个月份
没转换成中文,需要的同学自己改吧。
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>



  4. #include "maibu_sdk.h"
  5. #include "maibu_res.h"

  6. static const int lunarArr[82]={51536,//2019
  7. 86756,21856,43856,88866,27936,59990,29264,25776,51573,51888,//20-29
  8. 21920,44387,46736,95531,46368,45648,107702,42160,19120,21941,//30-39
  9. 23248,46752,111906,55584,119383,53840,42320,84693,19296,23376,//40-49
  10. 55971,60560,125224,59680,53856,42342,42352,19808,27988,30032,//50-59
  11. 29776,59699,26928,86711,21168,42416,87461,22176,46672,95396,//60-69
  12. 46240,108888,43344,21200,43734,43856,23200,47700,55888,54432,//70-79
  13. 117075,51552,103655,21856,43856,88869,27936,59984,58532,26800,//80-89
  14. 51576,19120,21936,44390,46752,29984,94804,46160,43184,84402,//90-99
  15. 19120//2100
  16. };
  17. static const uint16_t monthSum[13] = {0,0,31,59,90,120,151,181,212,243,273,304,334};
  18. static uint16_t lunarYear=2019;
  19. static uint8_t lunarMonth=9;
  20. static uint8_t lunarDay=15;
  21. void toLunar(uint16_t y,uint8_t m,uint8_t d){
  22.         //2019年2月5日,农历正月初一
  23.         int tmp=0;
  24.         if(y%4==0 && m<3 && d<30){
  25.                 tmp=1;
  26.         }
  27.         int days=(y-2019)*365+(y-2016)/4+monthSum[m]+d-35-tmp;
  28.         uint8_t subEnd=0;
  29.         uint8_t yy=0;
  30.         uint8_t run,i,dayspermon,monsperyear;
  31.         while(subEnd==0){
  32.                 //这个外部的循环每次检查一年的数据。
  33.                
  34.                 //先拿到这年的数据,取出闰月,右移四位。
  35.                 tmp=lunarArr[yy];
  36.                 run=tmp % 16;
  37.                 tmp=tmp/16;
  38.                 monsperyear=(run==0)? 12 : 13;
  39.                 //下面内部的循环则是检查这次的年份中每个月份的数据。
  40.                 for(i=1;i<=monsperyear;i++){
  41.                         dayspermon=(tmp%2==1)? 30 : 29;
  42.                         if(days<=dayspermon){
  43.                                 subEnd=1;
  44.                                 break;
  45.                         }else{
  46.                                 days=days-dayspermon;
  47.                                 tmp=tmp/2;
  48.                         }
  49.                 }
  50.                 if(subEnd==1){
  51.                         break;
  52.                 }
  53.                 yy++;
  54.         }
  55.         if(run==0){
  56.                 lunarMonth=i;
  57.         }else{
  58.                 if(i<=run){
  59.                         lunarMonth=i;
  60.                 }else if(i==run+1){
  61.                         lunarMonth=i+11;
  62.                 }else{
  63.                         lunarMonth=i-1;
  64.                 }
  65.         }
  66.         lunarYear=2019+yy;
  67.         lunarDay=days;
  68. }

  69. int main()
  70. {

  71.         /*创建窗口*/
  72.         P_Window p_window = app_window_create();
  73.         if (NULL == p_window)
  74.         {
  75.                 return 0;
  76.         }

  77.         /*创建文本图层框架范围*/
  78.         GRect frame = {{0, 45}, {40, 128}};
  79.         char buf[50]={0};
  80.         toLunar(2033,12,22);
  81.         sprintf(buf,"%d年%d月%d日",lunarYear,lunarMonth,lunarDay);

  82.         /*生成文本结构体, 依次为文本内容、文本显示框架、对齐方式、字体字号*/
  83.         LayerText text = {buf, frame, GAlignCenter, GColorWhite, U_GBK_SIMSUNBD_16};

  84.         /*创建文本图层*/
  85.         P_Layer layer = app_layer_create_text(&text);

  86.         /*添加文本图层到窗口中*/
  87.         app_window_add_layer(p_window, layer);

  88.         /*把窗口放入窗口栈中显示*/
  89.         app_window_stack_push(p_window);


  90.         return 1;

  91. }
复制代码

作者: ensb1234    时间: 2019-9-23 22:37
农历数据的格式是
0-3位:闰月所在月份,如果为0则无闰月;
4-15或16:每个月的大小月数据,1大0小,包括闰月在内(如果有的话),从正月开始到最后一个月按顺序倒排。无闰月时第4位是正月,第15位是腊月;有闰月就在置闰的那个月份插入闰月的大小月数据,最后一个月就排到第16位。
作者: Wangx    时间: 2020-2-6 20:36
本帖最后由 Wangx 于 2020-2-15 22:09 编辑

赞一个,正需要呢。。上表测试正常

IMG_20200215_220606.jpg (61.36 KB, 下载次数: 233)

表盘内置农历

表盘内置农历





欢迎光临 麦步社区-论坛 (http://bbs.maibu.cc/) Powered by Discuz! X3.2