请选择 进入手机版 | 继续访问电脑版
返回官网官方微博

麦步社区-麦步官方论坛-麦步智能手表官方交流平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: MAI 表盘
查看: 892|回复: 2

公历转农历代码,到2100年

[复制链接]

2

主题

8

帖子

162

麦力

精华
0
阅读权限
20
在线时间
5 小时

发表于 2019-9-23 22:27:28 | 显示全部楼层 |阅读模式
没学过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. }
复制代码

2

主题

8

帖子

162

麦力

精华
0
阅读权限
20
在线时间
5 小时

 楼主| 发表于 2019-9-23 22:37:16 | 显示全部楼层
农历数据的格式是
0-3位:闰月所在月份,如果为0则无闰月;
4-15或16:每个月的大小月数据,1大0小,包括闰月在内(如果有的话),从正月开始到最后一个月按顺序倒排。无闰月时第4位是正月,第15位是腊月;有闰月就在置闰的那个月份插入闰月的大小月数据,最后一个月就排到第16位。

8

主题

56

帖子

1633

麦力

精华
0
阅读权限
30
在线时间
86 小时

发表于 2020-2-6 20:36:51 | 显示全部楼层
本帖最后由 Wangx 于 2020-2-15 22:09 编辑

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

表盘内置农历

表盘内置农历
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|麦步官方论坛 ( 粤ICP备12052190号  

GMT+8, 2020-8-6 02:54 , Processed in 0.076336 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表