using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web; using System.Globalization; using System.Data; using CP.Cache; using CP.Common; using CP.Model; namespace CP.Business { public class CpQiShu { /// /// 缓存 /// static WMCache cache = WMCache.GetCacheService(); static List qishucfgList; static List czcfgList; #region 获取期数,适用天天开奖、春节有放假的彩种 /// /// 获取当前期数,适用3D/P3及天天开奖、春节有放假的情况 /// /// 当前时间 /// public static string GetEveryDayKjQI(string _cz, DateTime Tnow) { int cid = 0; try { CzEnum ua = (CzEnum)Enum.Parse(typeof(CzEnum), _cz, true); cid = (int)ua; } catch { } //获取配置数据 QiShuConfigInfo info = GetQiShuConfigInfo(1, TypeConverter.StrToInt(Tnow.Year.ToString())); int cx = info.Cx; //除夕 0表示不开,1 表示要开 int nday = info.Nday; //停开几天 string kjtimeStr = GetPublicCzInfo(cid).Kjtime; //开奖时间 int qi = 0; DateTime dt = Tnow; ChineseLunisolarCalendar cdt = new ChineseLunisolarCalendar(); DateTime etime = Convert.ToDateTime(dt.ToShortDateString() + " " + kjtimeStr); DateTime newday = dt.AddDays(1); //后一天的日期 ///晚上20:30之后,期数+1 if (DateTime.Compare(dt, etime) > 0) { dt = dt.AddDays(1); } int day = dt.DayOfYear;//公历第几天 int year = dt.Year;//公历年 int cday = cdt.GetDayOfYear(dt); //初几 int cyear = cdt.GetYear(dt);//农历年 int cyearsumday = cdt.GetDaysInYear(cyear);//农历年天数 qi = Convert.ToInt32(dt.Year.ToString() + day.ToString("000")); if (cx == 0)//除夕不开奖 { ///春节放假 if (cday >= nday && cyear == year) qi = qi - nday; ///春节放假,初几 if (cday < nday && cday > 0 && cyear == year) qi = qi - cday; } else //除夕要开奖 { ///春节放假 if (cday > nday && cyear == year) qi = qi - nday; ///春节放假,初几 if (cday <= nday && cday > 0 && cyear == year) qi = qi - cday + 1; } return qi.ToString(); } /// /// 重载 /// /// 当前时间 /// 类别 0:上一期,1:当期,2:下一期 public static string GetEveryDayKjQI(string _cz, DateTime Tnow, int typeid) { int qi = 0; //上期 if (typeid == 0) { int i = 1; int _qi = TypeConverter.StrToInt(GetEveryDayKjQI(_cz, Tnow)); while (_qi <= TypeConverter.StrToInt(GetEveryDayKjQI(_cz, Tnow.AddDays(-i)))) { i++; } return GetEveryDayKjQI(_cz, Tnow.AddDays(-i)); } //当期g if (typeid == 1) return GetEveryDayKjQI(_cz, Tnow); //下期 if (typeid == 2) { int i = 1; int _qi = TypeConverter.StrToInt(GetEveryDayKjQI(_cz, Tnow)); while (_qi >= TypeConverter.StrToInt(GetEveryDayKjQI(_cz, Tnow.AddDays(i)))) { i++; } return GetEveryDayKjQI(_cz, Tnow.AddDays(i)); } return qi.ToString("0000000"); } /// /// 获取短期数,适用3D/P3及天天开奖、春节有放假的情况 /// /// /// /// 类别 0:上一期,1:当期,2:下一期 /// public static string GetEveryDayKjQIShort(string _cz, DateTime Tnow, int typeid) { return GetEveryDayKjQI(_cz, Tnow, typeid).Substring(4, 3); } #endregion #region 根据期数返回日期,适用天天开奖的彩种 public static DateTime GetEveryDayKjDate(int _qi) { string _strQi = _qi.ToString(); string _yy = _strQi.Substring(0, 4); string _dd = _strQi.Substring(4, 3); int year = TypeConverter.StrToInt(_yy); int dd = TypeConverter.StrToInt(_dd); DateTime strD = new DateTime(year, 1, 1); strD = strD.AddDays(dd - 1); DateTime dt = strD; //获取配置数据 QiShuConfigInfo info = GetQiShuConfigInfo(1, year); ChineseLunisolarCalendar cdt = new ChineseLunisolarCalendar(); int cday = cdt.GetDayOfYear(dt); int cyear = cdt.GetYear(dt); int cyearsumday = cdt.GetDaysInYear(cyear);//农历年天数 ///除夕不开奖 if (info.Cx == 0) { if (cday > 0 && cyear == year || cday == cyearsumday) strD = strD.AddDays(info.Nday); } ///除夕要开奖 else if (info.Cx == 1) { if (cday > 0 && cyear == year) strD = strD.AddDays(info.Nday); } return strD; } #endregion #region 根据日期返回双色球、大乐透、七星彩、七乐彩等期数 /// /// /// /// 彩种名string,如fc3d,ssq... /// 待计算的时间 /// 类别 0:上一期,1:当期,2:下一期 /// public static string GetSpaceCzQi(string _cz, DateTime Tnow, int typeid) { CzEnum ua = (CzEnum)Enum.Parse(typeof(CzEnum), _cz, true); int cid = (int)ua; DateTime dt = Tnow; string kjtimeStr = GetPublicCzInfo(cid).Kjtime; int year = TypeConverter.StrToInt(dt.Year.ToString()); DateTime sDate = TypeConverter.StrToDateTime((year - 1).ToString() + "/01/01 00:00:00");//从上一年的第一期开始算,解决公历跨年的问题 DateTime eDate = TypeConverter.StrToDateTime((year + 1).ToString() + "/01/10 00:00:00");//算到后一年的10号,解决公历跨年算下一期的问题 DateTime etime = Convert.ToDateTime(dt.ToShortDateString() + " " + kjtimeStr); int tnowInt = TypeConverter.StrToInt(dt.ToString("yyyyMMdd")); //晚上开奖后翻期 if (DateTime.Compare(dt, etime) > 0) tnowInt = TypeConverter.StrToInt(dt.AddDays(1).ToString("yyyyMMdd")); //待计算总天数 int sumDay = eDate.Subtract(sDate).Days; //id 所有开奖日期顺序编号 int id = 0; //期数计数 int qi = 0; //开奖日期记录列表 List list = new List(); //公历跨年翻期 int backYear = TypeConverter.StrToInt(sDate.Year.ToString()); for (int i = 0; i < sumDay; i++) { DateTime _temp = sDate.AddDays(i); if (!IsHoliday(1, _temp))//春节放假日期不参与计算 { if (IsKjdate(cid, _temp))//是否是开奖日期 { JgKjTempInfo info = new JgKjTempInfo(); info.Id = id; int nextYear = TypeConverter.StrToInt(_temp.Year.ToString()); if (nextYear == backYear) qi++; //年份不等 else { qi = 1; backYear = nextYear; } info.Qi = TypeConverter.StrToInt(_temp.Year.ToString() + qi.ToString("000")); info.KjdateInt = TypeConverter.StrToInt(_temp.ToString("yyyyMMdd")); info.Kjdate = _temp; info.Week = GetIntWeek(_temp.DayOfWeek.ToString()); list.Add(info); id++; } } } for (int j = 0; j < list.Count; j++) { if (tnowInt == list[j].KjdateInt) { if (typeid == 0) //上期 return list[j - 1].Qi.ToString(); if (typeid == 1)//当期 return list[j].Qi.ToString(); if (typeid == 2)//下期 return list[j + 1].Qi.ToString(); } if (tnowInt > list[j].KjdateInt && tnowInt < list[j + 1].KjdateInt) { if (typeid == 0)//上期 return list[j].Qi.ToString(); if (typeid == 1)//当期 return list[j + 1].Qi.ToString(); if (typeid == 2)//下期 return list[j + 2].Qi.ToString(); } } return qi.ToString("0000000"); } public static string GetSpaceCzQiShort(string _cz, DateTime Tnow, int typeid) { return GetSpaceCzQi(_cz, Tnow, typeid).Substring(4, 3); } #endregion #region 根据期数返回双色球、大乐透、七星彩、七乐彩等开奖日期,一次批量更新很多数据时,需要复制后适当修改,反复循环调用效率不高 public static DateTime GetSpaceCzKjDate(string _cz, int _qi) { CzEnum ua = (CzEnum)Enum.Parse(typeof(CzEnum), _cz, true); int cid = (int)ua; string _strQi = _qi.ToString(); string year = _strQi.Substring(0, 4); DateTime sDate = TypeConverter.StrToDateTime(year + "/01/01 00:00:00");//从期数对应年份1月1号开始计算 DateTime eDate = TypeConverter.StrToDateTime(year + "/12/31 23:59:59");//算到期数对应年份12月31号 //待计算总天数 int sumDay = eDate.Subtract(sDate).Days; //id 所有开奖日期顺序编号 int id = 0; //期数计数 int qi = 0; //开奖日期记录列表 List list = new List(); for (int i = 0; i < sumDay+1; i++) { DateTime _temp = sDate.AddDays(i); if (!IsHoliday(1, _temp))//春节放假日期不参与计算 { if (IsKjdate(cid, _temp))//是否是开奖日期 { JgKjTempInfo info = new JgKjTempInfo(); info.Id = id; qi++; info.Qi = TypeConverter.StrToInt(_temp.Year.ToString() + qi.ToString("000")); info.KjdateInt = TypeConverter.StrToInt(_temp.ToString("yyyyMMdd")); info.Kjdate = _temp; info.Week = GetIntWeek(_temp.DayOfWeek.ToString()); list.Add(info); id++; } } } for (int j = 0; j < list.Count; j++) { if (_qi == list[j].Qi) return list[j].Kjdate; } return DateTime.Now; } #endregion #region 判断是否是农历过年 public static bool IsHoliday(int cid, DateTime Tnow) { //获取配置数据 QiShuConfigInfo info = GetQiShuConfigInfo(cid, TypeConverter.StrToInt(Tnow.Year.ToString())); int cx = 0; int nday = 0; //停开几天 if (info != null) { cx = info.Cx; //除夕 0表示不开,1 表示要开 nday = info.Nday; } DateTime dt = Tnow; ChineseLunisolarCalendar cdt = new ChineseLunisolarCalendar(); int day = dt.DayOfYear;//公历第几天 int year = dt.Year;//公历年 int cday = cdt.GetDayOfYear(dt); //初几 int cyear = cdt.GetYear(dt);//农历年 int cyearsumday = cdt.GetDaysInYear(cyear);//农历年天数 if (cx == 0)//除夕不开奖 { ///春节放假,初几 if (cday < nday && cday > 0 && cyear == year) return true; ///大年三十 if (cday == cyearsumday) return true; } else //除夕要开奖 { ///春节放假 if (cday <= nday && cyear == year) return true; } return false; } #endregion #region 是否是开奖日期,适用于双色球、大乐透、七星彩等间隔开奖彩种 public static bool IsKjdate(int cid, DateTime Tnow) { DateTime _date = Tnow; PublicCzConfigInfo info = GetPublicCzInfo(cid); string[] kjdate = info.Kjdate.Split(','); string week = _date.DayOfWeek.ToString().Trim(); for (int i = 0; i < kjdate.Length; i++) { if (kjdate[i].Equals(week)) return true; } return false; } #endregion #region 获取期数配置 /// /// 某一个朋种的期数配置 /// /// /// /// private static QiShuConfigInfo GetQiShuConfigInfo(int cid, int year) { QiShuConfigInfo info = new QiShuConfigInfo(); List list = GetQiShuConfigList(); if (list != null && list.Count > 0) { for (int i = 0; i < list.Count; i++) { if (list[i].Tid == cid && list[i].Year == year) return list[i]; } } return info; } /// /// cache中的所有期数配置 /// /// /// /// private static List GetQiShuConfigList() { if (qishucfgList != null) return qishucfgList; else { string key = string.Format(CacheKeys.SYSTEM_QI_SHU_CONFIG); List list = cache.GetObject>(key); if (list == null) { list = CpQiShus.GetCpQiShuConfigList(); cache.AddObject(key, list, (int)CacheTime.System); } qishucfgList = list; return list; } } #endregion #region 彩种配置 /// /// 从缓存或数据中获取彩种开奖日期和时间信息列表 /// /// public static List GetPublicCzConfig() { if (czcfgList != null) return czcfgList; else { string key = CacheKeys.SYSTEM_PUBLIC_CZ_CONFIG; List list = cache.GetObject>(key); if (list == null) { list = CpQiShus.GetPublicCzConfig(); cache.AddObject(key, list, (int)CacheTime.System); } czcfgList = list; return list; } } private static PublicCzConfigInfo GetPublicCzInfo(int cid) { PublicCzConfigInfo info = new PublicCzConfigInfo(); List list = GetPublicCzConfig(); for (int i = 0; i < list.Count; i++) { if (list[i].Cid == cid) return list[i]; } return info; } #endregion #region 返回数字型星期 public static int GetIntWeek(string StrWeek) { int intWeekday = -1; switch (StrWeek) { case "Monday": intWeekday = 1; break; case "Tuesday": intWeekday = 2; break; case "Wednesday": intWeekday = 3; break; case "Thursday": intWeekday = 4; break; case "Friday": intWeekday = 5; break; case "Saturday": intWeekday = 6; break; case "Sunday": intWeekday = 7; break; default: intWeekday = -1; break; } return intWeekday; } #endregion } }