单片机存储有限,需要进行精简
如果把每一年的 节气的日期值依次排序得到一个hashcode
如:
某一年,小寒是01月06日 大寒是01月20日 立春是......
则hashcode为
010601200204021903060321040504200506052106060622070707230808082309080923100910241108112312071222
根据几百年的数据分析,hashcode是很少的几个,仅仅50个,一个char类型就可以放某年的24节气数据
于是代码如下(以下代码虽然很长,但可以通过最下面的代码生成这段代码)
(已遍历1970-2100的每一天,对比验证以下计算代码正确)
//1970年至2100年的 节气类型表
static int[] JIEQI_TABLE = {
0,1,2,3,0,4,5,6,7,8,5,
6,9,10,11,12,13,14,15,16,17,0,15,18,19,0,15,20,19,0,15,20,19,0,15,20,6,0,21,22,6,
7,23,24,6,9,25,26,12,17,27,28,16,17,29,28,20,19,29,28,20,19,29,28,20,6,29,28,20,6,29,
30,22,6,31,32,24,6,33,34,26,16,35,34,26,36,35,37,28,36,38,37,28,20,38,37,28,20,39,37,30,
20,39,40,30,24,39,40,41,24,39,42,43,26,44,45,34,26,46,45,37,28,46,47,37,28,48,49,37,28,20,
};
//小寒->冬至 对应 1->24 | 无节气返回0
public static int GetJieqi(int y, int m, int d)
{
int code = JIEQI_TABLE[y - YEAR_START];
int md = m * 100 + d;
switch (m)
{
case 1:
switch (code)
{
case 0:
case 1:
case 2:
case 4:
case 5:
case 7:
case 8:
case 9:
case 10:
case 11:
case 14:
case 15:
case 21:
case 23:
case 25:
case 27:
case 29:
case 31:
case 33:
if (md == 106) return 1;
break;
case 3:
case 6:
case 12:
case 13:
case 16:
case 17:
case 18:
case 19:
case 20:
case 22:
case 24:
case 26:
case 28:
case 30:
case 32:
case 34:
case 35:
case 36:
case 37:
case 38:
case 39:
case 40:
case 41:
case 42:
case 43:
case 44:
case 46:
case 48:
if (md == 105) return 1;
break;
case 45:
case 47:
case 49:
if (md == 104) return 1;
break;
}
switch (code)
{
case 0:
case 3:
case 6:
case 7:
case 8:
case 9:
case 10:
case 12:
case 13:
case 14:
case 16:
case 17:
case 18:
case 19:
case 20:
case 22:
case 24:
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
case 33:
case 35:
case 36:
case 38:
case 39:
case 41:
case 43:
case 44:
case 46:
case 48:
if (md == 120) return 2;
break;
case 1:
case 2:
case 4:
case 5:
case 11:
case 15:
case 21:
case 23:
if (md == 121) return 2;
break;
case 34:
case 37:
case 40:
case 42:
case 45:
case 47:
case 49:
if (md == 119) return 2;
break;
}
break;
case 2:
switch (code)
{
case 0:
case 1:
case 3:
case 4:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 27:
case 29:
case 31:
case 33:
case 35:
case 36:
case 38:
case 39:
case 44:
case 46:
case 48:
if (md == 204) return 3;
break;
case 2:
case 5:
if (md == 205) return 3;
break;
case 26:
case 28:
case 30:
case 32:
case 34:
case 37:
case 40:
case 41:
case 42:
case 43:
case 45:
case 47:
case 49:
if (md == 203) return 3;
break;
}
switch (code)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 19:
case 21:
case 23:
case 25:
case 27:
case 29:
case 31:
case 33:
case 35:
case 36:
case 38:
case 39:
case 44:
case 46:
if (md == 219) return 4;
break;
case 18:
case 20:
case 22:
case 24:
case 26:
case 28:
case 30:
case 32:
case 34:
case 37:
case 40:
case 41:
case 42:
case 43:
case 45:
case 47:
case 48:
case 49:
if (md == 218) return 4;
break;
}
break;
case 3:
switch (code)
{
case 0:
case 1:
case 3:
case 4:
case 6:
case 7:
case 8:
case 9:
case 10:
case 13:
case 14:
case 17:
case 19:
if (md == 306) return 5;
break;
case 2:
case 5:
case 11:
case 12:
case 15:
case 16:
case 18:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
case 33:
case 34:
case 35:
case 36:
case 37:
case 38:
case 39:
case 40:
case 41:
case 42:
case 43:
case 45:
case 47:
case 49:
if (md == 305) return 5;
break;
case 44:
case 46:
case 48:
if (md == 304) return 5;
break;
}
switch (code)
{
case 0:
case 1:
case 3:
case 4:
case 6:
case 7:
case 8:
case 9:
case 10:
case 12:
case 13:
case 14:
case 17:
case 19:
if (md == 321) return 6;
break;
case 2:
case 5:
case 11:
case 15:
case 16:
case 18:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
case 33:
case 34:
case 35:
case 36:
case 37:
case 38:
case 39:
case 40:
case 41:
case 42:
case 43:
case 45:
case 47:
case 49:
if (md == 320) return 6;
break;
case 44:
case 46:
case 48:
if (md == 319) return 6;
break;
}
break;
case 4:
switch (code)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 6:
case 7:
case 8:
case 9:
case 10:
case 12:
case 13:
case 14:
case 16:
case 17:
case 18:
case 19:
case 20:
case 36:
if (md == 405) return 7;
break;
case 5:
case 11:
case 15:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
case 33:
case 34:
case 35:
case 37:
case 38:
case 39:
case 40:
case 41:
case 42:
case 43:
case 44:
case 45:
case 46:
case 47:
case 48:
case 49:
if (md == 404) return 7;
break;
}
switch (code)
{
case 0:
case 2:
case 3:
case 5:
case 6:
case 7:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 26:
case 28:
case 30:
case 36:
if (md == 420) return 8;
break;
case 1:
case 4:
case 8:
if (md == 421) return 8;
break;
case 25:
case 27:
case 29:
case 31:
case 32:
case 33:
case 34:
case 35:
case 37:
case 38:
case 39:
case 40:
case 41:
case 42:
case 43:
case 44:
case 45:
case 46:
case 47:
case 48:
case 49:
if (md == 419) return 8;
break;
}
break;
case 5:
switch (code)
{
case 0:
case 1:
case 4:
case 7:
case 8:
case 9:
case 10:
case 13:
case 14:
case 17:
case 19:
if (md == 506) return 9;
break;
case 2:
case 3:
case 5:
case 6:
case 11:
case 12:
case 15:
case 16:
case 18:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
case 33:
case 34:
case 35:
case 36:
case 37:
case 38:
case 40:
case 41:
case 42:
case 43:
case 45:
case 47:
case 49:
if (md == 505) return 9;
break;
case 39:
case 44:
case 46:
case 48:
if (md == 504) return 9;
break;
}
switch (code)
{
case 0:
case 2:
case 3:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
case 21:
case 22:
case 24:
case 26:
case 28:
case 36:
if (md == 521) return 10;
break;
case 1:
case 4:
if (md == 522) return 10;
break;
case 23:
case 25:
case 27:
case 29:
case 30:
case 31:
case 32:
case 33:
case 34:
case 35:
case 37:
case 38:
case 39:
case 40:
case 41:
case 42:
case 43:
case 44:
case 45:
case 46:
case 47:
case 48:
case 49:
if (md == 520) return 10;
break;
}
break;
case 6:
switch (code)
{
case 0:
case 1:
case 3:
case 4:
case 6:
case 7:
case 8:
case 9:
case 10:
case 12:
case 13:
case 14:
case 16:
case 17:
case 18:
case 19:
if (md == 606) return 11;
break;
case 2:
case 5:
case 11:
case 15:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
case 33:
case 34:
case 35:
case 36:
case 37:
case 38:
case 39:
case 40:
case 41:
case 42:
case 43:
case 44:
case 45:
case 47:
case 49:
if (md == 605) return 11;
break;
case 46:
case 48:
if (md == 604) return 11;
break;
}
switch (code)
{
case 0:
case 1:
case 4:
case 7:
case 8:
case 9:
case 10:
case 13:
case 14:
if (md == 622) return 12;
break;
case 2:
case 3:
case 5:
case 6:
case 11:
case 12:
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
case 34:
case 36:
case 37:
case 40:
case 41:
case 43:
if (md == 621) return 12;
break;
case 33:
case 35:
case 38:
case 39:
case 42:
case 44:
case 45:
case 46:
case 47:
case 48:
case 49:
if (md == 620) return 12;
break;
}
break;
case 7:
switch (code)
{
case 0:
case 2:
case 3:
case 5:
case 6:
case 7:
case 9:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 28:
case 30:
case 32:
case 36:
if (md == 707) return 13;
break;
case 1:
case 4:
case 8:
case 10:
if (md == 708) return 13;
break;
case 27:
case 29:
case 31:
case 33:
case 34:
case 35:
case 37:
case 38:
case 39:
case 40:
case 41:
case 42:
case 43:
case 44:
case 45:
case 46:
case 47:
case 48:
case 49:
if (md == 706) return 13;
break;
}
switch (code)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 12:
case 13:
case 14:
case 16:
case 17:
case 18:
case 19:
case 20:
case 22:
case 36:
if (md == 723) return 14;
break;
case 11:
case 15:
case 21:
case 23:
case 24:
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
case 33:
case 34:
case 35:
case 37:
case 38:
case 39:
case 40:
case 41:
case 42:
case 43:
case 44:
case 45:
case 46:
case 47:
case 48:
case 49:
if (md == 722) return 14;
break;
}
break;
case 8:
switch (code)
{
case 0:
case 1:
case 3:
case 4:
case 7:
case 8:
case 9:
case 10:
case 13:
case 14:
case 17:
case 19:
if (md == 808) return 15;
break;
case 2:
case 5:
case 6:
case 11:
case 12:
case 15:
case 16:
case 18:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
case 33:
case 34:
case 35:
case 36:
case 37:
case 38:
case 40:
case 41:
case 42:
case 43:
case 45:
case 47:
if (md == 807) return 15;
break;
case 39:
case 44:
case 46:
case 48:
case 49:
if (md == 806) return 15;
break;
}
switch (code)
{
case 0:
case 2:
case 3:
case 5:
case 6:
case 7:
case 9:
case 11:
case 12:
case 13:
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 28:
case 30:
case 32:
case 36:
case 41:
if (md == 823) return 16;
break;
case 1:
case 4:
case 8:
case 10:
case 14:
if (md == 824) return 16;
break;
case 27:
case 29:
case 31:
case 33:
case 34:
case 35:
case 37:
case 38:
case 39:
case 40:
case 42:
case 43:
case 44:
case 45:
case 46:
case 47:
case 48:
case 49:
if (md == 822) return 16;
break;
}
break;
case 9:
switch (code)
{
case 0:
case 1:
case 3:
case 4:
case 6:
case 7:
case 8:
case 9:
case 10:
case 12:
case 13:
case 14:
case 17:
case 19:
if (md == 908) return 17;
break;
case 2:
case 5:
case 11:
case 15:
case 16:
case 18:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
case 33:
case 34:
case 35:
case 36:
case 37:
case 38:
case 39:
case 40:
case 41:
case 42:
case 43:
case 45:
case 47:
case 49:
if (md == 907) return 17;
break;
case 44:
case 46:
case 48:
if (md == 906) return 17;
break;
}
switch (code)
{
case 0:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
case 22:
case 24:
case 26:
case 28:
case 36:
if (md == 923) return 18;
break;
case 1:
if (md == 924) return 18;
break;
case 21:
case 23:
case 25:
case 27:
case 29:
case 30:
case 31:
case 32:
case 33:
case 34:
case 35:
case 37:
case 38:
case 39:
case 40:
case 41:
case 42:
case 43:
case 44:
case 45:
case 46:
case 47:
case 48:
case 49:
if (md == 922) return 18;
break;
}
break;
case 10:
switch (code)
{
case 0:
case 1:
case 4:
case 8:
case 10:
case 14:
if (md == 1009) return 19;
break;
case 2:
case 3:
case 5:
case 6:
case 7:
case 9:
case 11:
case 12:
case 13:
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
case 32:
case 34:
case 36:
case 37:
case 41:
case 43:
if (md == 1008) return 19;
break;
case 31:
case 33:
case 35:
case 38:
case 39:
case 40:
case 42:
case 44:
case 45:
case 46:
case 47:
case 48:
case 49:
if (md == 1007) return 19;
break;
}
switch (code)
{
case 0:
case 1:
case 4:
case 7:
case 8:
case 9:
case 10:
case 13:
case 14:
case 17:
if (md == 1024) return 20;
break;
case 2:
case 3:
case 5:
case 6:
case 11:
case 12:
case 15:
case 16:
case 18:
case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
case 33:
case 34:
case 35:
case 36:
case 37:
case 40:
case 41:
case 42:
case 43:
case 45:
if (md == 1023) return 20;
break;
case 38:
case 39:
case 44:
case 46:
case 47:
case 48:
case 49:
if (md == 1022) return 20;
break;
}
break;
case 11:
switch (code)
{
case 0:
case 1:
case 4:
case 7:
case 8:
case 9:
case 10:
case 13:
case 14:
case 17:
if (md == 1108) return 21;
break;
case 2:
case 3:
case 5:
case 6:
case 11:
case 12:
case 15:
case 16:
case 18:
case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
case 33:
case 34:
case 35:
case 36:
case 37:
case 40:
case 41:
case 42:
case 43:
case 45:
if (md == 1107) return 21;
break;
case 38:
case 39:
case 44:
case 46:
case 47:
case 48:
case 49:
if (md == 1106) return 21;
break;
}
switch (code)
{
case 0:
case 1:
case 4:
case 7:
case 8:
case 10:
case 14:
if (md == 1123) return 22;
break;
case 2:
case 3:
case 5:
case 6:
case 9:
case 11:
case 12:
case 13:
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
case 34:
case 36:
case 37:
case 40:
case 41:
case 43:
if (md == 1122) return 22;
break;
case 33:
case 35:
case 38:
case 39:
case 42:
case 44:
case 45:
case 46:
case 47:
case 48:
case 49:
if (md == 1121) return 22;
break;
}
break;
case 12:
switch (code)
{
case 0:
case 2:
case 3:
case 5:
case 6:
case 7:
case 9:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 27:
case 28:
case 30:
case 32:
case 34:
case 36:
case 41:
case 43:
if (md == 1207) return 23;
break;
case 1:
case 4:
case 8:
case 10:
if (md == 1208) return 23;
break;
case 29:
case 31:
case 33:
case 35:
case 37:
case 38:
case 39:
case 40:
case 42:
case 44:
case 45:
case 46:
case 47:
case 48:
case 49:
if (md == 1206) return 23;
break;
}
switch (code)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 16:
case 17:
case 18:
case 19:
case 20:
case 22:
case 24:
case 26:
case 36:
if (md == 1222) return 24;
break;
case 15:
case 21:
case 23:
case 25:
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
case 33:
case 34:
case 35:
case 37:
case 38:
case 39:
case 40:
case 41:
case 42:
case 43:
case 44:
case 45:
case 46:
case 47:
case 48:
case 49:
if (md == 1221) return 24;
break;
}
break;
}
return 0;
}
用c#生成这段代码
调用CreateCode()生成以上代码
public class JieqiItem
{
//小寒->冬至 24节气的 月日值(月*100+日)
public int[] list = new int[24];
public string hashCode = "";//例:01040119.... 表示:小寒是1月4日 大寒是1月19日 立春是......
}
static int YEAR_START = 1970;
static int YEAR_END = 2100;
static List<JieqiItem> jieqiList = new List<JieqiItem>();
static Dictionary<string, int> jieqiDict = new Dictionary<string, int>();
//QueryJieqi函数可以通过数据库或天文计算获得,其中内容仅做参考
static JieqiItem QueryJieqi(int year)
{
Nongli info = new Nongli();
JieqiItem jieqiItem = new JieqiItem();
for (int i = 0; i < 24; i++)
{
MySql.Query(info, year,i);
jieqiItem.hashCode += info.GetDateStr();
jieqiItem.list[i] = info.GetDateInt();
}
return jieqiItem;
}
static void Init()
{
if (jieqiList.Count > 0)
return;
for (int y = YEAR_START; y <= YEAR_END; y++)
{
JieqiItem jieqiItem = QueryJieqi(y);
if (!jieqiDict.ContainsKey(jieqiItem.hashCode))
{
jieqiDict[jieqiItem.hashCode] = jieqiList.Count;
jieqiList.Add(jieqiItem);
}
}
}
public static string CreateCode()
{
Init();
StringBuilder sb = new StringBuilder();
sb.AppendLine($"//{YEAR_START}年至{YEAR_END}年的 节气类型表");
sb.AppendLine("static int[] JIEQI_TABLE = {");
for (int y = YEAR_START; y <= YEAR_END; y++)
{
JieqiItem jieqiItem = QueryJieqi(y);
sb.Append($"{jieqiDict[jieqiItem.hashCode]},");
if (y % 30 == 0) sb.AppendLine("");
}
sb.AppendLine("};");
sb.AppendLine("//小寒->冬至 对应 1->24 无节气返回0");
sb.AppendLine("public static int GetJieqi(int y, int m, int d)\r\n{");
sb.AppendLine("int code = JIEQI_TABLE[y - YEAR_START];");
sb.AppendLine("int md = m * 100 + d;");
sb.AppendLine("");
sb.AppendLine("switch (m)\r\n{");
for (int m = 0; m < 12; m++)
{
sb.AppendLine($"case {m + 1}:");
for (int k = 0; k < 2; k++)
{
sb.AppendLine("switch (code)\r\n{");
#region switch (code)
List<int> listx = new List<int>();
for (int i = 0; i < jieqiList.Count; i++)
{
if (!listx.Contains(jieqiList[i].list[m * 2 + k]))
listx.Add(jieqiList[i].list[m * 2 + k]);
}
foreach (int item in listx)
{
for (int i = 0; i < jieqiList.Count; i++)
{
if (jieqiList[i].list[m * 2 + k] == item)
{
sb.AppendLine($"case {i}:");
}
}
sb.AppendLine($"if (md == {item}) return {(m * 2 + k) + 1};");
sb.AppendLine("break;");
}
#endregion
sb.AppendLine("}");
}
sb.AppendLine("break;");
}
sb.AppendLine("}");
sb.AppendLine("return 0;");
sb.AppendLine("}");
return sb.ToString();
}