Calendar1.cpp
上传用户:desheng311
上传日期:2007-01-08
资源大小:47k
文件大小:30k
源码类别:

其他小程序

开发平台:

Visual C++

  1. // Calendar1.cpp : implementation file
  2. //
  3. /***************************************************************************
  4.    致看到这些源代码的兄弟:
  5.        你好!
  6.        这本来是我为一个商业PDA产品开发的日历程序,最近移植于PC机上, 所以算法
  7.    和数据部分是用纯C++写的,不涉及MFC,所有的代码都是以短节省存储空间为主要目
  8.    的.
  9.    很高兴你对这些代码有兴趣,你可以随意复制和使用些代码,唯一有一点小小的
  10.    愿望:在你使用和复制给别人时,别忘注明这些代码作者:-)。程序代码也就罢了,后
  11.    面的数据可是我辛辛苦苦从万年历上找出来输进去的。
  12.    如果你有什么好的意见不妨Mail给我。
  13.        wangfei@hanwang.com.cn
  14.    或
  15.    wangfei@engineer.com.cn
  16.                                                                  2000年3月
  17. ****************************************************************************/
  18. #include "stdafx.h"
  19. #include "Calendar.h"
  20. #include "Calendar1.h"
  21. #include "Calendarfrm.h"
  22. #ifdef _DEBUG
  23. #define new DEBUG_NEW
  24. #undef THIS_FILE
  25. static char THIS_FILE[] = __FILE__;
  26. #endif
  27. /////////////////////////////////////////////////////////////////////////////
  28. // CCalendar
  29. extern WORD gLunarMonthDay[];
  30. extern BYTE gLunarMonth[];
  31. extern BYTE gLunarHolDay[];
  32. const WORD START_YEAR =1901;
  33. const WORD END_YEAR   =2050;
  34. void CCalendar::l_InitData()
  35. {
  36. SYSTEMTIME systime;
  37. ::GetSystemTime(&systime);
  38. m_iYear  = systime.wYear;
  39. m_iMonth = systime.wMonth;
  40. m_iDay   = systime.wDay;
  41. m_dwBackColor      = RGB(255,255,255);
  42. m_dwForeColor      = RGB(0,0,0);
  43. m_dwSelColor       = RGB(150,150,230);
  44. m_dwSelForeColor   = RGB(255,255,255);
  45. m_dwTitleBkColor     = RGB(190,70,70);
  46. m_dwTitleColor = RGB(255,255,0);
  47. }
  48. CCalendar::CCalendar(WORD iYear, WORD iMonth, WORD iDay)
  49. {
  50.    if(!SetDate(iYear, iMonth, iDay))
  51.    l_InitData();
  52. }
  53. CCalendar::CCalendar()
  54. {
  55.    l_InitData();
  56. }
  57. CCalendar::~CCalendar()
  58. {
  59.   DestroyWindow(); 
  60. }
  61. BEGIN_MESSAGE_MAP(CCalendar, CWnd)
  62. //{{AFX_MSG_MAP(CCalendar)
  63. ON_WM_PAINT()
  64. ON_WM_LBUTTONDOWN()
  65. ON_WM_CONTEXTMENU()
  66. ON_WM_CREATE()
  67. //}}AFX_MSG_MAP
  68. ON_COMMAND(ID_TITLEBKCOLOR, OnTitleBkColor)
  69. ON_COMMAND(ID_TITLECOLOR,   OnTitleColor)
  70. ON_COMMAND(ID_SELCOLOR,     OnSelColor)
  71. ON_COMMAND(ID_FORECOLOR,    OnForeColor)
  72. END_MESSAGE_MAP()
  73. #define COL_WIDTH    32
  74. #define ROW_HEIGHT   20
  75. #define TITLE_HEIGHT 20
  76. BOOL CCalendar::Create(RECT &rect, CWnd *pParentWnd, UINT nID)
  77. {
  78.     CString szClassName = AfxRegisterWndClass(CS_CLASSDC|CS_SAVEBITS|
  79.                                       CS_HREDRAW|CS_VREDRAW,
  80.                                               0, (HBRUSH)CBrush(RGB(255,255,255)), 0);
  81. rect.right = rect.left + COL_WIDTH*7 +4;
  82.     rect.bottom = rect.top + TITLE_HEIGHT+ROW_HEIGHT*6 +10 ;
  83. if(!CWnd::CreateEx(WS_EX_CLIENTEDGE, szClassName, _T(""),
  84.                 WS_CHILD|WS_VISIBLE|WS_TABSTOP, rect, 
  85. pParentWnd, nID, NULL)) 
  86.    return FALSE;
  87.     UpdateWindow();
  88.     for(int i=0; i<42; i++)
  89. m_oBitMapList[i].LoadBitmap(IDB_BITMAP1+i); 
  90. m_oPopMenu.CreatePopupMenu();
  91. m_oPopMenu.AppendMenu(MF_STRING, ID_TITLEBKCOLOR, _T("标题背景色..."));
  92. m_oPopMenu.AppendMenu(MF_STRING, ID_TITLECOLOR,   _T("标题前景色...")); 
  93. m_oPopMenu.AppendMenu(MF_STRING, ID_FORECOLOR ,   _T("日期前景色..."));
  94.   m_oPopMenu.AppendMenu(MF_STRING, ID_SELCOLOR,     _T("选中区颜色..."));
  95. return TRUE;
  96. }
  97. /////////////////////////////////////////////////////////////////////////////
  98. // CCalendar message handlers
  99. void CCalendar::l_PaintTitle(CPaintDC &dc)
  100. {
  101.    CRect rect ;
  102.    GetClientRect(&rect);
  103.    rect.left ++;   rect.top ++;
  104.    rect.right --;  rect.bottom = rect.top + TITLE_HEIGHT;
  105.    dc.FillRect(&rect, &CBrush(m_dwTitleBkColor));
  106.    dc.SetBkColor(m_dwTitleBkColor); 
  107.    dc.SetTextColor(m_dwTitleColor); 
  108.    int startx = rect.left +8;
  109.    char sztext[][3]={"日","一","二","三","四","五","六"};
  110.    for(int i=0; i <7; i++)
  111.    {
  112.       dc.TextOut(startx, rect.top +2, sztext[i]);
  113.       startx += COL_WIDTH;
  114.    }
  115. }
  116. void CCalendar:: l_PaintOneDay(CPaintDC &dc, CDC &imgdc, WORD &iDay, 
  117.    WORD &iLunarYear, WORD &iLunarMonth, 
  118.    WORD &iLunarDay, 
  119.    LONG startx, LONG starty)
  120. {
  121.  char text[3];
  122.      sprintf(text, "%2d", iDay);
  123.      // select icon
  124.  if(iLunarDay!=1)
  125.       imgdc.SelectObject(&m_oBitMapList[iLunarDay-1]);
  126.  else
  127.       imgdc.SelectObject(&m_oBitMapList[29+iLunarMonth]);
  128.      // if day == current day
  129.  if(iDay++ == m_iDay)
  130.  {
  131. dc.FillRect(&CRect(startx-1, starty, 
  132.    startx +COL_WIDTH-3, starty + ROW_HEIGHT), 
  133. &CBrush(m_dwSelColor)); 
  134. dc.SetTextColor(m_dwSelForeColor);
  135. dc.SetBkColor(m_dwSelColor);
  136. dc.TextOut(startx, starty +2, text);
  137. dc.SetBkColor(m_dwBackColor);
  138. dc.SetTextColor(m_dwForeColor); 
  139. dc.BitBlt(startx+17, starty +2, 8,16,&imgdc,0,0,MERGEPAINT);  
  140.  }
  141.  else
  142.  {
  143. dc.TextOut(startx, starty+2, text);
  144. dc.BitBlt(startx+17, starty +2, 8,16,&imgdc,0,0,SRCCOPY);  
  145.  }
  146.  if(iLunarDay<29)
  147.   iLunarDay++;
  148.  else
  149.  {
  150.  LONG days = LunarMonthDays(iLunarYear, iLunarMonth);
  151.  if(!HIWORD(days) && iLunarDay == LOWORD(days))
  152.  iLunarMonth = (iLunarMonth)%12+1;
  153.  if(iLunarDay < LOBYTE(days))
  154.  iLunarDay++;
  155.  else
  156.  iLunarDay =1;
  157.  }
  158. }
  159. void CCalendar::l_PaintDate(CPaintDC &dc)
  160. {
  161.    CDC imgdc;
  162.    imgdc.CreateCompatibleDC(&dc);
  163.    RECT rect;
  164.    GetClientRect(&rect);
  165.    rect.top  +=TITLE_HEIGHT+6;
  166.    dc.SetBkColor(m_dwBackColor);
  167.    dc.SetTextColor(m_dwForeColor);
  168.    WORD day =1;
  169.    WORD iLunarYear, iLunarMonth, iLunarDay;
  170.    GetLunarDate(m_iYear, m_iMonth, 1, iLunarYear, iLunarMonth, iLunarDay); 
  171.    for(int i=0; i<6; i++, rect.top += ROW_HEIGHT)
  172.    {
  173.    long startx = rect.left +2;
  174.    for(int j=0; j<7; j++,startx += COL_WIDTH)
  175.    {
  176.    if(j < WeekDay(m_iYear, m_iMonth, 1) && i==0)
  177.      continue;
  178.           if(day > MonthDays(m_iYear, m_iMonth))
  179.    break;
  180.            l_PaintOneDay(dc, imgdc, day, iLunarYear, iLunarMonth,
  181.                             iLunarDay, startx, rect.top);
  182.    }
  183. }
  184. }
  185. void CCalendar::OnPaint() 
  186. {
  187. CPaintDC dc(this); // device context for painting
  188. CFont *font = ((CCalendarFrm *)GetParent())->GetDispFont();
  189. dc.SelectObject(font);
  190.     dc.SetMapMode(0); 
  191. l_PaintTitle(dc);
  192. l_PaintDate(dc);
  193. }
  194. LONG CCalendar::CalcDateDiff(WORD iEndYear, WORD iEndMonth, WORD iEndDay,
  195.                     WORD  iStartYear, WORD iStartMonth, WORD iStartDay)
  196. {
  197. WORD monthday[]={0, 31, 59 ,90, 120, 151, 181, 212, 243, 273, 304, 334}; 
  198. //计算两个年份1月1日之间相差的天数
  199. LONG iDiffDays =(iEndYear - iStartYear)*365;
  200. iDiffDays += (iEndYear-1)/4 - (iStartYear-1)/4;
  201. iDiffDays -= ((iEndYear-1)/100 - (iStartYear-1)/100);
  202. iDiffDays += (iEndYear-1)/400 - (iStartYear-1)/400;
  203.     //加上iEndYear年1月1日到iEndMonth月iEndDay日之间的天数
  204.     iDiffDays += monthday[iEndMonth-1] +
  205.                            (IsLeapYear(iEndYear)&&iEndMonth>2? 1: 0);
  206.     iDiffDays += iEndDay;
  207. //减去iStartYear年1月1日到iStartMonth月iStartDay日之间的天数
  208. iDiffDays -= (monthday[iStartMonth-1] + 
  209.                   (IsLeapYear(iStartYear)&&iStartMonth>2 ? 1: 0));
  210.     iDiffDays -= iStartDay;
  211. return iDiffDays;
  212. }
  213. void  CCalendar::l_CalcLunarDate(WORD &iYear, WORD &iMonth ,WORD &iDay, LONG iSpanDays)
  214. {
  215. //阳历1901年2月19日为阴历1901年正月初一
  216. //阳历1901年1月1日到2月19日共有49天
  217.     if(iSpanDays <49)
  218. {
  219. iYear  = START_YEAR-1;
  220. if(iSpanDays <19)
  221.   iMonth = 11;  
  222.   iDay   = 11+WORD(iSpanDays);
  223. }
  224. else
  225. {
  226. iMonth = 12;
  227. iDay   =  WORD(iSpanDays) -18;
  228. }
  229. return ;
  230. }
  231. //下面从阴历1901年正月初一算起
  232. iSpanDays -=49;
  233.     iYear  = START_YEAR;
  234. iMonth = 1;
  235. iDay   = 1;
  236. //计算年
  237. LONG tmp = LunarYearDays(iYear); 
  238. while(iSpanDays >= tmp)
  239. {
  240. iSpanDays -= tmp;
  241. tmp = LunarYearDays(++iYear);
  242. }
  243.     //计算月
  244. tmp = LOWORD(LunarMonthDays(iYear, iMonth));
  245. while(iSpanDays >= tmp)
  246. {
  247. iSpanDays -= tmp;
  248.     if(iMonth == GetLeapMonth(iYear))
  249. {
  250. tmp  = HIWORD(LunarMonthDays(iYear, iMonth));
  251. if(iSpanDays < tmp)
  252. break;
  253. iSpanDays -= tmp;
  254. }
  255. tmp = LOWORD(LunarMonthDays(iYear, ++iMonth));
  256. }
  257. //计算日
  258. iDay += WORD(iSpanDays);
  259. }
  260. WORD CCalendar::GetLunarDate(WORD iYear, WORD iMonth, WORD iDay,
  261.                      WORD &iLunarYear, WORD &iLunarMonth, WORD &iLunarDay)
  262. {
  263.    l_CalcLunarDate(iLunarYear, iLunarMonth, iLunarDay, 
  264.                               CalcDateDiff(iYear, iMonth, iDay));
  265.    return l_GetLunarHolDay(iYear, iMonth, iDay);
  266. }
  267. //根据节气数据存储格式,计算阳历iYear年iMonth月iDay日对应的节气,
  268. WORD  CCalendar::l_GetLunarHolDay(WORD iYear, WORD iMonth, WORD iDay)
  269. {
  270. BYTE &flag = gLunarHolDay[(iYear - START_YEAR)*12+iMonth -1];
  271. WORD day;
  272. if(iDay <15)
  273.  day= 15 - ((flag>>4)&0x0f);
  274. else
  275. day = ((flag)&0x0f)+15;
  276. if(iDay == day)
  277.    return (iMonth-1) *2 + (iDay>15? 1: 0) +1; 
  278. else
  279.    return 0;
  280. }
  281. void CCalendar::GetDate(WORD &iYear, WORD &iMonth, WORD &iDay) 
  282. {
  283. iYear  = m_iYear;
  284. iMonth = m_iMonth;
  285. iDay   = m_iDay;
  286. }
  287. BOOL CCalendar::SetDate(WORD iYear, WORD iMonth, WORD iDay)
  288. {
  289.   if(iYear < START_YEAR || iYear > END_YEAR || iMonth <1 || iMonth >12)
  290.      return FALSE;
  291.   if(iDay <1 || iDay > MonthDays(iYear, iMonth))
  292.     return FALSE;
  293.   m_iYear   = iYear;
  294.   m_iMonth  = iMonth;
  295.   m_iDay    = iDay;
  296.   return TRUE;
  297. WORD CCalendar::WeekDay(WORD iYear, WORD iMonth, WORD iDay)
  298. {
  299.     //数组元素monthday[i]表示第i个月以前的总天数除以7的余数
  300. WORD monthday[]={0,3,3,6,1,4,6,2,5,0,3,5};
  301. WORD iDays = (iYear-1)%7 + (iYear-1)/4 - (iYear-1)/100 +(iYear-1)/400;
  302. iDays += (monthday[iMonth-1] +iDay) ;
  303. //如果iYear是闰年
  304.     if(IsLeapYear(iYear) && iMonth>2)
  305. iDays++;
  306. //返回:0,1,2,3,4,5,6表日、一、二、三、四、五、六
  307. return iDays%7;
  308. }
  309. WORD CCalendar::MonthDays(WORD iYear, WORD iMonth)
  310. {
  311. switch(iMonth)
  312. {
  313. case 1:case 3:case 5:case 7:case 8:case 10:case 12:
  314. return 31;
  315. break;
  316. case 4:case 6:case 9:case 11:
  317. return 30;
  318. break;
  319. case 2:
  320. //如果是闰年
  321. if(IsLeapYear(iYear))
  322. return 29;
  323. else
  324. return 28;
  325. break;
  326. }
  327. return 0;
  328. }
  329. WORD CCalendar::GetLeapMonth(WORD iLunarYear)
  330. {
  331. BYTE &flag = gLunarMonth[(iLunarYear - START_YEAR)/2];
  332.   return  (iLunarYear - START_YEAR)%2 ? flag&0x0f : flag>>4;
  333. }
  334. LONG CCalendar::LunarMonthDays(WORD iLunarYear, WORD iLunarMonth)
  335. {
  336. if(iLunarYear < START_YEAR) 
  337. return 30L;
  338. WORD height =0 ,low =29;
  339. int iBit = 16 - iLunarMonth;
  340.     if(iLunarMonth > GetLeapMonth(iLunarYear) && GetLeapMonth(iLunarYear))
  341.    iBit --;
  342. if(gLunarMonthDay[iLunarYear - START_YEAR] & (1<<iBit))
  343.         low ++;
  344.     
  345. if(iLunarMonth == GetLeapMonth(iLunarYear))
  346. if(gLunarMonthDay[iLunarYear - START_YEAR] & (1<< (iBit -1)))
  347.      height =30;
  348. else 
  349.  height =29;
  350. return MAKELONG(low, height);
  351. }
  352. WORD CCalendar::LunarYearDays(WORD iLunarYear)
  353. {
  354. /*
  355. WORD days=348 ; //12*29
  356. int  month = 12 ;
  357. //如果iYear年有闰月,则为13个月
  358.     if(gLanarMonth[iYear - START_YEAR]) 
  359. month ++;
  360.     //如果某月是三十天则days++
  361. while(month >=0 && (gLanarMonthDay[iYear - START_YEAR] & (1 << (16 - month))))
  362. {   
  363. days ++; 
  364.     month --;
  365. }
  366. return days;
  367. */
  368. WORD days =0;
  369. for(WORD  i=1; i<=12; i++)
  370.         LONG  tmp = LunarMonthDays(iLunarYear ,i); 
  371. days += HIWORD(tmp);
  372. days += LOWORD(tmp);
  373. }
  374.     return days;
  375. }
  376. void CCalendar::FormatLunarYear(WORD  iYear, char *pBuffer)
  377. {
  378. char szText1[]="甲乙丙丁戊己庚辛壬癸";
  379. char szText2[]="子丑寅卯辰巳午未申酉戌亥";
  380. char szText3[]="鼠牛虎免龙蛇马羊猴鸡狗猪";
  381. memcpy(pBuffer,  szText1+((iYear-4)%10)*2,2);
  382. memcpy(pBuffer+2,szText2+((iYear-4)%12)*2,2);
  383. pBuffer[4]=' ';
  384. memcpy(pBuffer+5,szText3+((iYear-4)%12)*2,2);
  385. strcpy(pBuffer+7,"年");
  386. }
  387. void CCalendar::FormatMonth(WORD iMonth, char *pBuffer, BOOL bLunar)
  388. {
  389.    if(!bLunar && iMonth==1)
  390.    {
  391.    strcpy(pBuffer, " 一月");
  392.    return;
  393.    }
  394.    char szText[]="正二三四五六七八九十";
  395.    if(iMonth<=10)
  396.    {
  397.    memcpy(pBuffer, " ", 2);
  398.        memcpy(pBuffer+2, szText + (iMonth -1)*2, 2);
  399.        strcpy(pBuffer+4 , "月");
  400.    return;
  401.    }
  402.    if (iMonth == 11)
  403.    strcpy(pBuffer, "十一");
  404.    else
  405.    strcpy(pBuffer, "十二");
  406.     strcpy(pBuffer+4 , "月");
  407.    
  408. }
  409. void CCalendar::FormatLunarDay(WORD  iDay, char *pBuffer)
  410. {
  411.     char szText1[]="初十廿三";
  412. char szText2[]="一二三四五六七八九十";
  413. if(iDay != 20 && iDay !=30)
  414. {
  415. memcpy(pBuffer, szText1 + (iDay-1)/10*2 ,2);
  416. memcpy(pBuffer+2, szText2 + ((iDay-1)%10)*2 ,2);
  417. pBuffer[4]='';
  418. }
  419. else
  420. {
  421.         memcpy(pBuffer, szText1 + iDay/10*2, 2);
  422. strcpy(pBuffer+2, szText2 +18);
  423. }
  424. }
  425. WORD CCalendar::l_CalcSelectDay(POINT * pt)
  426. {
  427. RECT rect;
  428.     GetClientRect(&rect);
  429. WORD iRow = (pt->y - rect.top -26)/ROW_HEIGHT;
  430. WORD iCol = (pt->x - rect.left )/COL_WIDTH;
  431. WORD startcol ,endrow, endcol;
  432. startcol = WeekDay(m_iYear, m_iMonth, 1);
  433. endcol   = WeekDay(m_iYear, m_iMonth, MonthDays(m_iYear,m_iMonth));
  434. endrow   = (MonthDays(m_iYear, m_iMonth) + startcol -1)/7 ;
  435.     if(iRow == 0 && iCol < startcol || iRow == endrow && iCol > endcol ||  iRow > endrow)
  436. return 0;
  437. return iRow *7 + iCol + 1 - startcol ;
  438. }
  439. void CCalendar::OnLButtonDown(UINT nFlags, CPoint point) 
  440. {
  441. WORD day = l_CalcSelectDay(&point);
  442. if(day !=0 && day != m_iDay)
  443. {
  444. m_iDay = day;
  445. ::PostMessage(GetParent()->m_hWnd, UM_SELCHANGE, MAKELONG(m_iMonth, m_iYear), m_iDay); 
  446.     }
  447. SetFocus(); 
  448. CWnd::OnLButtonDown(nFlags, point);
  449. }
  450. void CCalendar::OnContextMenu(CWnd* pWnd, CPoint point) 
  451. {
  452. m_oPopMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
  453. this); 
  454. }
  455. void CCalendar::OnTitleBkColor()
  456. {
  457.   CColorDialog colordlg;
  458.   if(colordlg.DoModal() != IDOK)
  459.   return;
  460.   m_dwTitleBkColor = colordlg.GetColor();
  461.   Invalidate(); 
  462. }
  463. void CCalendar::OnTitleColor()
  464. {
  465. CColorDialog colordlg;
  466.   if(colordlg.DoModal() != IDOK)
  467.   return;
  468.   m_dwTitleColor = colordlg.GetColor();
  469.   Invalidate(); 
  470. }
  471. void CCalendar::OnSelColor()
  472. {
  473.   CColorDialog colordlg;
  474.   if(colordlg.DoModal() != IDOK)
  475.   return;
  476.   
  477.   m_dwSelColor = colordlg.GetColor();
  478.   Invalidate(); 
  479. }
  480. void CCalendar::OnForeColor()
  481. {
  482. CColorDialog colordlg;
  483.   if(colordlg.DoModal() != IDOK)
  484.   return;
  485.   
  486.   m_dwForeColor = colordlg.GetColor();
  487.   Invalidate(); 
  488. }
  489. #undef COL_WIDTH
  490. #undef ROW_HEIGHT
  491. #undef TITLE_HEIGHT
  492. /******************************************************************************
  493.   下面为阴历计算所需的数据,为节省存储空间,所以采用下面比较变态的存储方法.
  494.    
  495. *******************************************************************************/
  496. //数组gLunarDay存入阴历1901年到2100年每年中的月天数信息,
  497. //阴历每月只能是29或30天,一年用12(或13)个二进制位表示,对应位为1表30天,否则为29天
  498. WORD gLunarMonthDay[]=
  499. {
  500. //测试数据只有1901.1.1 --2050.12.31
  501.   0X4ae0, 0Xa570, 0X5268, 0Xd260, 0Xd950, 0X6aa8, 0X56a0, 0X9ad0, 0X4ae8, 0X4ae0,   //1910
  502.   0Xa4d8, 0Xa4d0, 0Xd250, 0Xd548, 0Xb550, 0X56a0, 0X96d0, 0X95b0, 0X49b8, 0X49b0,   //1920
  503.   0Xa4b0, 0Xb258, 0X6a50, 0X6d40, 0Xada8, 0X2b60, 0X9570, 0X4978, 0X4970, 0X64b0,   //1930
  504.   0Xd4a0, 0Xea50, 0X6d48, 0X5ad0, 0X2b60, 0X9370, 0X92e0, 0Xc968, 0Xc950, 0Xd4a0,   //1940
  505.   0Xda50, 0Xb550, 0X56a0, 0Xaad8, 0X25d0, 0X92d0, 0Xc958, 0Xa950, 0Xb4a8, 0X6ca0,   //1950
  506.   0Xb550, 0X55a8, 0X4da0, 0Xa5b0, 0X52b8, 0X52b0, 0Xa950, 0Xe950, 0X6aa0, 0Xad50,   //1960
  507.   0Xab50, 0X4b60, 0Xa570, 0Xa570, 0X5260, 0Xe930, 0Xd950, 0X5aa8, 0X56a0, 0X96d0,   //1970
  508.   0X4ae8, 0X4ad0, 0Xa4d0, 0Xd268, 0Xd250, 0Xd528, 0Xb540, 0Xb6a0, 0X96d0, 0X95b0,   //1980
  509.   0X49b0, 0Xa4b8, 0Xa4b0, 0Xb258, 0X6a50, 0X6d40, 0Xada0, 0Xab60, 0X9370, 0X4978,   //1990
  510.   0X4970, 0X64b0, 0X6a50, 0Xea50, 0X6b28, 0X5ac0, 0Xab60, 0X9368, 0X92e0, 0Xc960,   //2000
  511.   0Xd4a8, 0Xd4a0, 0Xda50, 0X5aa8, 0X56a0, 0Xaad8, 0X25d0, 0X92d0, 0Xc958, 0Xa950,   //2010
  512.   0Xb4a0, 0Xb550, 0Xb550, 0X55a8, 0X4ba0, 0Xa5b0, 0X52b8, 0X52b0, 0Xa930, 0X74a8,   //2020
  513.   0X6aa0, 0Xad50, 0X4da8, 0X4b60, 0X9570, 0Xa4e0, 0Xd260, 0Xe930, 0Xd530, 0X5aa0,   //2030
  514.   0X6b50, 0X96d0, 0X4ae8, 0X4ad0, 0Xa4d0, 0Xd258, 0Xd250, 0Xd520, 0Xdaa0, 0Xb5a0,   //2040
  515.   0X56d0, 0X4ad8, 0X49b0, 0Xa4b8, 0Xa4b0, 0Xaa50, 0Xb528, 0X6d20, 0Xada0, 0X55b0,   //2050
  516.   
  517. };
  518. //数组gLanarMonth存放阴历1901年到2050年闰月的月份,如没有则为0,每字节存两年
  519. BYTE  gLunarMonth[]=
  520. {
  521. 0X00, 0X50, 0X04, 0X00, 0X20,   //1910
  522. 0X60, 0X05, 0X00, 0X20, 0X70,   //1920
  523. 0X05, 0X00, 0X40, 0X02, 0X06,   //1930
  524. 0X00, 0X50, 0X03, 0X07, 0X00,   //1940
  525. 0X60, 0X04, 0X00, 0X20, 0X70,   //1950
  526. 0X05, 0X00, 0X30, 0X80, 0X06,   //1960
  527. 0X00, 0X40, 0X03, 0X07, 0X00,   //1970
  528. 0X50, 0X04, 0X08, 0X00, 0X60,   //1980
  529. 0X04, 0X0a, 0X00, 0X60, 0X05,   //1990
  530. 0X00, 0X30, 0X80, 0X05, 0X00,   //2000
  531. 0X40, 0X02, 0X07, 0X00, 0X50,   //2010
  532. 0X04, 0X09, 0X00, 0X60, 0X04,   //2020
  533. 0X00, 0X20, 0X60, 0X05, 0X00,   //2030
  534. 0X30, 0Xb0, 0X06, 0X00, 0X50,   //2040
  535. 0X02, 0X07, 0X00, 0X50, 0X03    //2050
  536. };
  537. //数组gLanarHoliDay存放每年的二十四节气对应的阳历日期
  538. //每年的二十四节气对应的阳历日期几乎固定,平均分布于十二个月中
  539. //   1月          2月         3月         4月         5月         6月   
  540. //小寒 大寒   立春  雨水   惊蛰 春分   清明 谷雨   立夏 小满   芒种 夏至
  541. //   7月          8月         9月         10月       11月        12月  
  542. //小暑 大暑   立秋  处暑   白露 秋分   寒露 霜降   立冬 小雪   大雪 冬至
  543. /*********************************************************************************
  544.  节气无任何确定规律,所以只好存表,要节省空间,所以....
  545.   下面这种存法实在是太变态了,你就将就着看吧
  546. **********************************************************************************/
  547. //数据格式说明:
  548. //如1901年的节气为
  549. //  1月     2月     3月   4月    5月   6月   7月    8月   9月    10月  11月     12月
  550. // 6, 21, 4, 19,  6, 21, 5, 21, 6,22, 6,22, 8, 23, 8, 24, 8, 24, 8, 24, 8, 23, 8, 22
  551. // 9, 6,  11,4,   9, 6,  10,6,  9,7,  9,7,  7, 8,  7, 9,  7,  9, 7,  9, 7,  8, 7, 15
  552. //上面第一行数据为每月节气对应日期,15减去每月第一个节气,每月第二个节气减去15得第二行
  553. // 这样每月两个节气对应数据都小于16,每月用一个字节存放,高位存放第一个节气数据,低位存放
  554. //第二个节气的数据,可得下表
  555. BYTE gLunarHolDay[]=
  556. {
  557. 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77,   //1901
  558. 0X96, 0XA4, 0X96, 0X96, 0X97, 0X87, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78,   //1902
  559. 0X96, 0XA5, 0X87, 0X96, 0X87, 0X87, 0X79, 0X69, 0X69, 0X69, 0X78, 0X78,   //1903
  560. 0X86, 0XA5, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X78, 0X87,   //1904
  561. 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77,   //1905
  562. 0X96, 0XA4, 0X96, 0X96, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78,   //1906
  563. 0X96, 0XA5, 0X87, 0X96, 0X87, 0X87, 0X79, 0X69, 0X69, 0X69, 0X78, 0X78,   //1907
  564. 0X86, 0XA5, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87,   //1908
  565. 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77,   //1909
  566. 0X96, 0XA4, 0X96, 0X96, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78,   //1910
  567. 0X96, 0XA5, 0X87, 0X96, 0X87, 0X87, 0X79, 0X69, 0X69, 0X69, 0X78, 0X78,   //1911
  568. 0X86, 0XA5, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87,   //1912
  569. 0X95, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77,   //1913
  570. 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78,   //1914
  571. 0X96, 0XA5, 0X97, 0X96, 0X97, 0X87, 0X79, 0X79, 0X69, 0X69, 0X78, 0X78,   //1915
  572. 0X96, 0XA5, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87,   //1916
  573. 0X95, 0XB4, 0X96, 0XA6, 0X96, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X87,   //1917
  574. 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X77,   //1918
  575. 0X96, 0XA5, 0X97, 0X96, 0X97, 0X87, 0X79, 0X79, 0X69, 0X69, 0X78, 0X78,   //1919
  576. 0X96, 0XA5, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87,   //1920
  577. 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X87,   //1921
  578. 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X77,   //1922
  579. 0X96, 0XA4, 0X96, 0X96, 0X97, 0X87, 0X79, 0X79, 0X69, 0X69, 0X78, 0X78,   //1923
  580. 0X96, 0XA5, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87,   //1924
  581. 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X87,   //1925
  582. 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77,   //1926
  583. 0X96, 0XA4, 0X96, 0X96, 0X97, 0X87, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78,   //1927
  584. 0X96, 0XA5, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87,   //1928
  585. 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87,   //1929
  586. 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77,   //1930
  587. 0X96, 0XA4, 0X96, 0X96, 0X97, 0X87, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78,   //1931
  588. 0X96, 0XA5, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87,   //1932
  589. 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87,   //1933
  590. 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77,   //1934
  591. 0X96, 0XA4, 0X96, 0X96, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78,   //1935
  592. 0X96, 0XA5, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87,   //1936
  593. 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87,   //1937
  594. 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77,   //1938
  595. 0X96, 0XA4, 0X96, 0X96, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78,   //1939
  596. 0X96, 0XA5, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87,   //1940
  597. 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87,   //1941
  598. 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77,   //1942
  599. 0X96, 0XA4, 0X96, 0X96, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78,   //1943
  600. 0X96, 0XA5, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87,   //1944
  601. 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87,   //1945
  602. 0X95, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X77,   //1946
  603. 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78,   //1947
  604. 0X96, 0XA5, 0XA6, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87,   //1948
  605. 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X79, 0X78, 0X79, 0X77, 0X87,   //1949
  606. 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X77,   //1950
  607. 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78,   //1951
  608. 0X96, 0XA5, 0XA6, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87,   //1952
  609. 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87,   //1953
  610. 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X78, 0X79, 0X78, 0X68, 0X78, 0X87,   //1954
  611. 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77,   //1955
  612. 0X96, 0XA5, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87,   //1956
  613. 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87,   //1957
  614. 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87,   //1958
  615. 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77,   //1959
  616. 0X96, 0XA4, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //1960
  617. 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87,   //1961
  618. 0X96, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87,   //1962
  619. 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77,   //1963
  620. 0X96, 0XA4, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //1964
  621. 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87,   //1965
  622. 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87,   //1966
  623. 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77,   //1967
  624. 0X96, 0XA4, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //1968
  625. 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87,   //1969
  626. 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87,   //1970
  627. 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77,   //1971
  628. 0X96, 0XA4, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //1972
  629. 0XA5, 0XB5, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87,   //1973
  630. 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87,   //1974
  631. 0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X77,   //1975
  632. 0X96, 0XA4, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X89, 0X88, 0X78, 0X87, 0X87,   //1976
  633. 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87,   //1977
  634. 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X78, 0X87,   //1978
  635. 0X96, 0XB4, 0X96, 0XA6, 0X96, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X77,   //1979
  636. 0X96, 0XA4, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //1980
  637. 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X77, 0X87,   //1981
  638. 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87,   //1982
  639. 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X77,   //1983
  640. 0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87,   //1984
  641. 0XA5, 0XB4, 0XA6, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87,   //1985
  642. 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87,   //1986
  643. 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X79, 0X78, 0X69, 0X78, 0X87,   //1987
  644. 0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86,   //1988
  645. 0XA5, 0XB4, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //1989
  646. 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87,   //1990
  647. 0X95, 0XB4, 0X96, 0XA5, 0X86, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87,   //1991
  648. 0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86,   //1992
  649. 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //1993
  650. 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87,   //1994
  651. 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X76, 0X78, 0X69, 0X78, 0X87,   //1995
  652. 0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86,   //1996
  653. 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //1997
  654. 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87,   //1998
  655. 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87,   //1999
  656. 0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86,   //2000
  657. 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //2001
  658. 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87,   //2002
  659. 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87,   //2003
  660. 0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86,   //2004
  661. 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //2005
  662. 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87,   //2006
  663. 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87,   //2007
  664. 0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86,   //2008
  665. 0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //2009
  666. 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87,   //2010
  667. 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X78, 0X87,   //2011
  668. 0X96, 0XB4, 0XA5, 0XB5, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86,   //2012
  669. 0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87,   //2013
  670. 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87,   //2014
  671. 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87,   //2015
  672. 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86,   //2016
  673. 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87,   //2017
  674. 0XA5, 0XB4, 0XA6, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87,   //2018
  675. 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87,   //2019
  676. 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X86,   //2020
  677. 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86,   //2021
  678. 0XA5, 0XB4, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //2022
  679. 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87,   //2023
  680. 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96,   //2024
  681. 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86,   //2025
  682. 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //2026
  683. 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87,   //2027
  684. 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96,   //2028
  685. 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86,   //2029
  686. 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //2030
  687. 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87,   //2031
  688. 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96,   //2032
  689. 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X86,   //2033
  690. 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X78, 0X88, 0X78, 0X87, 0X87,   //2034
  691. 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87,   //2035
  692. 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96,   //2036
  693. 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86,   //2037
  694. 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //2038
  695. 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87,   //2039
  696. 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96,   //2040
  697. 0XA5, 0XC3, 0XA5, 0XB5, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86,   //2041
  698. 0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87,   //2042
  699. 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87,   //2043
  700. 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X88, 0X87, 0X96,   //2044
  701. 0XA5, 0XC3, 0XA5, 0XB4, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86,   //2045
  702. 0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87,   //2046
  703. 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87,   //2047
  704. 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA5, 0X97, 0X87, 0X87, 0X88, 0X86, 0X96,   //2048
  705. 0XA4, 0XC3, 0XA5, 0XA5, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X86,   //2049
  706. 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X78, 0X78, 0X87, 0X87    //2050
  707. };