/// <summary> /// 指定某日, 计算出它的所属节(气), 上一节(气), 下一节(气)信息, 并把计算结果保存在日对象中 /// </summary> /// <param name="ob"></param> /// <returns>计算成功返回 true, 否则返回 false </returns> public bool CalcJieQiInfo(OB ob, CalcJieQiType calcType) { const int JiQiInfo_Name = 0; const int JiQiInfo_JDTime = 1; const int JiQiInfo_Time = 2; const int JiQiInfo_HistoricalJDTime = 3; const int JiQiInfo_HistoricalTime = 4; const int JiQiInfo_DifferentTime = 5; const int JiQiInfo_JieOrQi = 6; const int JiQiInfo_YueJian = 7; const int JiQiInfo_DayDifference = 8; const int PrevJieQiFlag = 0; const int ThisJieQiFlag = 1; const int NextJieQiFlag = 2; double y = ob.y; int j, counter = 0, thisJie = -1, jieQiPos = 0; JieQiInfo jieqiInfo; int[] jieqiInfoPos = new int[3]; object[,] jieqiList = new object[31, 9]; double v, qi = 0; int num = SSQ.calcJieQi(LunarHelper.int2((y - 2000) * 365.2422 + 180), true); // 计算节气, 以"霜降"开始 for (j = 0; j < num; j++) // 建表 { if (calcType == CalcJieQiType.CalcJie) // 只计算节 { if (((j + 24) % 24) % 2 == 0) // 气(跳过, 只使用节) { continue; } } if (calcType == CalcJieQiType.CalcQi) // 只计算气 { if (((j + 24) % 24) % 2 == 1) // 节(跳过, 只使用气) { continue; } } qi = SSQ.ZQ[j]; v = obb.qi_accurate2(qi); jieqiList[counter, JiQiInfo_Time] = JD.setFromJD_str(v + LunarHelper.J2000); jieQiPos = (j + 24) % 24 + 20; // 与 obb.jqmc 对应, "霜降"距首位"冬至"的距离为 20 if (jieQiPos >= 24) { jieQiPos -= 24; } jieqiList[counter, JiQiInfo_JieOrQi] = true; jieqiList[counter, JiQiInfo_Name] = obb.jqmc[jieQiPos]; jieqiList[counter, JiQiInfo_YueJian] = obb.JieQiYueJian[jieQiPos]; jieqiList[counter, JiQiInfo_JDTime] = v + LunarHelper.J2000; jieqiList[counter, JiQiInfo_HistoricalTime] = JD.setFromJD_str(qi + LunarHelper.J2000); jieqiList[counter, JiQiInfo_HistoricalJDTime] = qi + LunarHelper.J2000; jieqiList[counter, JiQiInfo_DifferentTime] = (LunarHelper.int2(v + 0.5) != qi ? true : false); jieqiList[counter, JiQiInfo_DayDifference] = (int)(LunarHelper.int2(v + 0.5) - qi); counter++; } for (j = 0; j < SSQ.ZQ.Count; j++) // △重要: 由于调用了 SSQ.calcJieQi 方法, 计算了 31 个节气(超出年周期)数据, 故应清零 { SSQ.ZQ[j] = 0; } if (ob.y >= 0) { int ymd = ob.y * 10000 + ob.m * 100 + ob.d; // 转换成为数值表示的日期: 如 20090422 for (j = counter - 1; j >= 0; j--) // 逆序查表(表中的交节日期数据是由小到大排列的) { string jieqiTime = (string)jieqiList[j, JiQiInfo_Time]; int jieqiYear = int.Parse(jieqiTime.Substring(0, 5)); int jieqiMonth = int.Parse(jieqiTime.Substring(6, 2)); int jieqiDay = int.Parse(jieqiTime.Substring(9, 2)); if (jieqiYear * 10000 + jieqiMonth * 100 + jieqiDay <= ymd) // 找到所属的节气 { thisJie = j; break; } } } else { int ymd = ob.y * 10000 - (99 - ob.m) * 100 - (99 - ob.d); for (j = 0; j < counter; j++) // 顺序查表(表中的交节日期数据是由小到大排列的, 计算为数值时也要严格递增) { string jieqiTime = (string)jieqiList[j, JiQiInfo_Time]; int jieqiYear = int.Parse(jieqiTime.Substring(0, 5)); int jieqiMonth = int.Parse(jieqiTime.Substring(6, 2)); int jieqiDay = int.Parse(jieqiTime.Substring(9, 2)); int jieqiYmd = jieqiYear * 10000 - (99 - jieqiMonth) * 100 - (99 - jieqiDay); if (jieqiYmd >= ymd) { if (jieqiYmd > ymd) { thisJie = j - 1; } else { thisJie = j; } break; } } } if (thisJie > 0 && thisJie < counter) { jieqiInfoPos[ThisJieQiFlag] = thisJie; jieqiInfoPos[PrevJieQiFlag] = jieqiInfoPos[ThisJieQiFlag] - 1; jieqiInfoPos[NextJieQiFlag] = jieqiInfoPos[ThisJieQiFlag] + 1; for (j = 0; j < jieqiInfoPos.Length; j++) { switch (j) { case PrevJieQiFlag: jieqiInfo = ob.PreviousJieQi; break; case ThisJieQiFlag: jieqiInfo = ob.ThisJieQi; break; case NextJieQiFlag: jieqiInfo = ob.NextJieQi; break; default: jieqiInfo = null; break; } if (jieqiInfo != null) { jieqiInfo.JieOrQi = (bool)jieqiList[jieqiInfoPos[j], JiQiInfo_JieOrQi]; jieqiInfo.Name = (string)jieqiList[jieqiInfoPos[j], JiQiInfo_Name]; jieqiInfo.YueJian = (string)jieqiList[jieqiInfoPos[j], JiQiInfo_YueJian]; jieqiInfo.Time = (string)jieqiList[jieqiInfoPos[j], JiQiInfo_Time]; jieqiInfo.JDTime = (double)jieqiList[jieqiInfoPos[j], JiQiInfo_JDTime]; jieqiInfo.HistoricalTime = (string)jieqiList[jieqiInfoPos[j], JiQiInfo_HistoricalTime]; jieqiInfo.HistoricalJDTime = (double)jieqiList[jieqiInfoPos[j], JiQiInfo_HistoricalJDTime]; jieqiInfo.DifferentTime = (bool)jieqiList[jieqiInfoPos[j], JiQiInfo_DifferentTime]; jieqiInfo.DayDifference = (int)jieqiList[jieqiInfoPos[j], JiQiInfo_DayDifference]; } } return(true); } return(false); }
/// <summary> /// 指定某日, 计算出它的所属节(气), 上一节(气), 下一节(气)信息, 并把计算结果保存在日对象中 /// </summary> /// <param name="ob"></param> /// <returns>计算成功返回 true, 否则返回 false </returns> public bool CalcJieQiInfo(OB ob, CalcJieQiType calcType) { const int JiQiInfo_Name = 0; const int JiQiInfo_JDTime = 1; const int JiQiInfo_Time = 2; const int JiQiInfo_HistoricalJDTime = 3; const int JiQiInfo_HistoricalTime = 4; const int JiQiInfo_DifferentTime = 5; const int JiQiInfo_JieOrQi = 6; const int JiQiInfo_YueJian = 7; const int JiQiInfo_DayDifference = 8; const int PrevJieQiFlag = 0; const int ThisJieQiFlag = 1; const int NextJieQiFlag = 2; double y = ob.y; int j, counter = 0, thisJie = -1, jieQiPos = 0; JieQiInfo jieqiInfo; int[] jieqiInfoPos = new int[3]; object[,] jieqiList = new object[31, 9]; double v, qi = 0; int num = SSQ.calcJieQi(LunarHelper.int2((y - 2000) * 365.2422 + 180), true); // 计算节气, 以"霜降"开始 for (j = 0; j < num; j++) // 建表 { if (calcType == CalcJieQiType.CalcJie) // 只计算节 if (((j + 24) % 24) % 2 == 0) // 气(跳过, 只使用节) continue; if (calcType == CalcJieQiType.CalcQi) // 只计算气 if (((j + 24) % 24) % 2 == 1) // 节(跳过, 只使用气) continue; qi = SSQ.ZQ[j]; v = obb.qi_accurate2(qi); jieqiList[counter, JiQiInfo_Time] = JD.setFromJD_str(v + LunarHelper.J2000); jieQiPos = (j + 24) % 24 + 20; // 与 obb.jqmc 对应, "霜降"距首位"冬至"的距离为 20 if(jieQiPos >= 24) jieQiPos -= 24; jieqiList[counter, JiQiInfo_JieOrQi] = true; jieqiList[counter, JiQiInfo_Name] = obb.jqmc[jieQiPos]; jieqiList[counter, JiQiInfo_YueJian] = obb.JieQiYueJian[jieQiPos]; jieqiList[counter, JiQiInfo_JDTime] = v + LunarHelper.J2000; jieqiList[counter, JiQiInfo_HistoricalTime] = JD.setFromJD_str(qi + LunarHelper.J2000); jieqiList[counter, JiQiInfo_HistoricalJDTime] = qi + LunarHelper.J2000; jieqiList[counter, JiQiInfo_DifferentTime] = (LunarHelper.int2(v + 0.5) != qi ? true : false); jieqiList[counter, JiQiInfo_DayDifference] = (int)(LunarHelper.int2(v + 0.5) - qi); counter ++; } for(j = 0; j < SSQ.ZQ.Count; j++) // △重要: 由于调用了 SSQ.calcJieQi 方法, 计算了 31 个节气(超出年周期)数据, 故应清零 SSQ.ZQ[j] = 0; if (ob.y >= 0) { int ymd = ob.y * 10000 + ob.m * 100 + ob.d; // 转换成为数值表示的日期: 如 20090422 for (j = counter - 1; j >= 0; j--) // 逆序查表(表中的交节日期数据是由小到大排列的) { string jieqiTime = (string)jieqiList[j, JiQiInfo_Time]; int jieqiYear = int.Parse(jieqiTime.Substring(0, 5)); int jieqiMonth = int.Parse(jieqiTime.Substring(6, 2)); int jieqiDay = int.Parse(jieqiTime.Substring(9, 2)); if (jieqiYear * 10000 + jieqiMonth * 100 + jieqiDay <= ymd) // 找到所属的节气 { thisJie = j; break; } } } else { int ymd = ob.y * 10000 - (99 - ob.m) * 100 - (99 - ob.d); for (j = 0; j < counter; j++) // 顺序查表(表中的交节日期数据是由小到大排列的, 计算为数值时也要严格递增) { string jieqiTime = (string)jieqiList[j, JiQiInfo_Time]; int jieqiYear = int.Parse(jieqiTime.Substring(0, 5)); int jieqiMonth = int.Parse(jieqiTime.Substring(6, 2)); int jieqiDay = int.Parse(jieqiTime.Substring(9, 2)); int jieqiYmd = jieqiYear * 10000 - (99 - jieqiMonth) * 100 - (99 - jieqiDay); if (jieqiYmd >= ymd) { if (jieqiYmd > ymd) thisJie = j - 1; else thisJie = j; break; } } } if (thisJie > 0 && thisJie < counter) { jieqiInfoPos[ThisJieQiFlag] = thisJie; jieqiInfoPos[PrevJieQiFlag] = jieqiInfoPos[ThisJieQiFlag] - 1; jieqiInfoPos[NextJieQiFlag] = jieqiInfoPos[ThisJieQiFlag] + 1; for (j = 0; j < jieqiInfoPos.Length; j++) { switch (j) { case PrevJieQiFlag: jieqiInfo = ob.PreviousJieQi; break; case ThisJieQiFlag: jieqiInfo = ob.ThisJieQi; break; case NextJieQiFlag: jieqiInfo = ob.NextJieQi; break; default: jieqiInfo = null; break; } if (jieqiInfo != null) { jieqiInfo.JieOrQi = (bool)jieqiList[jieqiInfoPos[j], JiQiInfo_JieOrQi]; jieqiInfo.Name = (string)jieqiList[jieqiInfoPos[j], JiQiInfo_Name]; jieqiInfo.YueJian = (string)jieqiList[jieqiInfoPos[j], JiQiInfo_YueJian]; jieqiInfo.Time = (string)jieqiList[jieqiInfoPos[j], JiQiInfo_Time]; jieqiInfo.JDTime = (double)jieqiList[jieqiInfoPos[j], JiQiInfo_JDTime]; jieqiInfo.HistoricalTime = (string)jieqiList[jieqiInfoPos[j], JiQiInfo_HistoricalTime]; jieqiInfo.HistoricalJDTime = (double)jieqiList[jieqiInfoPos[j], JiQiInfo_HistoricalJDTime]; jieqiInfo.DifferentTime = (bool)jieqiList[jieqiInfoPos[j], JiQiInfo_DifferentTime]; jieqiInfo.DayDifference = (int)jieqiList[jieqiInfoPos[j], JiQiInfo_DayDifference]; } } return true; } return false; }