📄 yinyang.h
字号:
#ifndef _YINYANG_H_
#define _YINYANG_H_
const CString TianGan[10] =
{_T("甲"),_T("乙"),_T("丙"),_T("丁"),_T("戊"),_T("己"),_T("庚"),_T("辛"),_T("壬"),_T("癸")};
const CString DiZhi[12]=
{_T("子"),_T("丑"),_T("寅"),_T("卯"),_T("辰"),_T("巳"),_T("午"),_T("未"),_T("申"),_T("酉"),_T("戌"),_T("亥")};
const CString YearAnimals[12]=
{_T("鼠"),_T("牛"),_T("虎"),_T("兔"),_T("龙"),_T("蛇"),_T("马"),_T("羊"),_T("猴"),_T("鸡"),_T("狗"),_T("猪")};
const CString CYinMonth[12]=
{_T("正"),_T("二"),_T("三"),_T("四"),_T("五"),_T("六"),_T("七"),_T("八"),_T("九"),_T("十"),_T("十一"),_T("腊")};
//const TCHAR CYinDay[30]=
const CString CYinDay[30]=
{
_T("初一"),_T("初二"),_T("初三"),_T("初四"),_T("初五"),_T("初六"),
_T("初七"),_T("初八"),_T("初九"),_T("初十"),_T("十一"),_T("十二"),
_T("十三"),_T("十四"),_T("十五"),_T("十六"),_T("十七"),_T("十八"),
_T("十九"),_T("二十"),_T("廿一"),_T("廿二"),_T("廿三"),_T("廿四"),
_T("廿五"),_T("廿六"),_T("廿七"),_T("廿八"),_T("廿九"),_T("三十")
};
const TCHAR CCweek[7]=
{'日','一','二','三','四','五','六'};
const int YEAR = 0;//1;
const int MONTH =1;// 2;
const int DAY = 2;// 3;
const int YangDateBase[3]= {1971,12,8};//08};
const int YinDateBase[3]= {1971,10,21};
const int YinGanZhiBase[3] = {48,36,4};
// {y,m,d: '辛亥','己亥','丁卯' Search table to get GZ numbers.}
BOOL bYinBaseLeapMonth = FALSE;
const int YinAnimalBase = 12; //{ Pig }
const int YEAR_START = 1881;// {1903;}
const int YEAR_END = 2060;
const int YinMonthsOfYear[YEAR_END-YEAR_START+1] =
{ 2922,3498,2980,6985,3401,2709,5419,1325,2733,5482,
3498,7588,3748,3402,2709,2711,1366,2741,2773,5842,
1874,3749,
5706,1611,2715,5462,1386,2905,5970,1874,6949,2853,
2635,4779,2733,1386,2921,3497,7570,3474,3365,6733,
2646,694, 5557,1748,3753,7826,3730,3366,1323,2647,
4790,2906,1748,3785,1865,5779,2707,1323,2651,2733,
1386,6997,2980,2889,6803,2709,5421,1334,2733,5546,
1458,3493,7498,3402,2709,2711,1366,2741,2773,1746,
3749,3749,1610,3223,2715,5466,1386,2921,5970,2898,
2853,5707,2635,5291,685, 1389,2921,3497,3474,7461,
3365,6733,2646,694, 1461,1749,3753,7826,3730,3366,
2646,2647,5334,858, 1749,5833,1865,1683,5419,1323,
2651,5466,1386,6997,2980,2889,6803,2709,1325,2733,
2733,5546,1490,3493,7498,3402,3222,5422,1366,2741,
5554,1746,3749,1829,1611,3323,3343,1370,2274,2921,
5970,2898,2853,6859,2635,1199,1371,1453,3434,6994,
3474,7461,3365,2645,5293,1206,1461,3498,3785,7826,
3730,2854,2646,2647,1206,1711,1909,1865
};
/*
{//数字构造方法: 阴历一至十二月(有闰月时为十三月):
// 大月(30天)为1,小月(29天)为0,每月占1bit,
// 由右向左依次为:1,2,3,...,12/13 }
*/
const BYTE LeapMonthOfYear[YEAR_END-YEAR_START+1] =//[YEAR_START..YEAR_END] of Byte{Integer} =
{7,0,0,5,0,0,4,0,0,2, 0,6,0,0,5,0,0,3,0,8,
0,0,
5,0,0,4,0,0,2,0,6,0, 0,5,0,0,2,0,7,0,0,5,
0,0,4,0,0,2,0,6,0,0, 5,0,0,3,0,7,0,0,6,0,
0,4,0,0,2,0,7,0,0,5, 0,0,3,0,8,0,0,6,0,0,
4,0,0,3,0,7,0,0,5,0, 0,4,0,8,0,0,6,0,0,4,
0,10,0,0,6,0,0,5,0,0, 3,0,8,0,0,5,0,0,4,0,
0,2,0,7,0,0,5,0,0,4, 0,9,0,0,6,0,0,4,0,0,
2,0,6,0,0,5,0,0,3,0, 7,0,0,6,0,0,5,0,0,2,
0,7,0,0,5,0,0,3,0,8, 0,0,6,0,0,4,0,0
};
/*
节气: 24 JieQi/year, 每节气的公历日期只有两种(?), 可编码为0和1,
使得 1 bit/JieQi, 用 3 Bytes(LongInt) 代表一年的节气表. 98.3.18
而目前的节气表结构为(每一年): (13579..., 2468....)
即分为上半月和下半月两组, 每组12节气, 1 Byte/JieQi, 是日期的个位数}
*/
const CString JieQi[24]=// array [1..24, 1..4] of Char =
{
_T("小寒"), _T("大寒"), _T("立春"), _T("雨水"), _T("惊蛰"), _T("春分"),
_T("清明"), _T("谷雨"), _T("立夏"), _T("小满"), _T("芒种"), _T("夏至"),
_T("小暑"), _T("大暑"), _T("立秋"), _T("处暑"), _T("白露"), _T("秋分"),
_T("寒露"), _T("霜降"), _T("立冬"), _T("小雪"), _T("大雪"), _T("冬至")
};
/*
{节气表}
*/
const int JieQiStartYear = 1960;
const int JieQiEndYear = 2000;
const CString JieQiOfYear[JieQiEndYear-JieQiStartYear+1][2]=
{
{_T("655556777877"),_T("190011333322")},
{_T("546566788877"),_T("091011333322")},
{_T("646566788987"),_T("091012333432")},
{_T("646566888988"),_T("191122344432")},
{_T("655556777877"),_T("190011333322")},
{_T("546566788877"),_T("091011333322")},
{_T("546566788987"),_T("091012333432")},
{_T("646566888988"),_T("191122344432")},
{_T("655555777877"),_T("190011333322")},
{_T("546566788877"),_T("091011333322")},
{_T("646566788987"),_T("091012333432")},
{_T("646566888988"),_T("191122344432")},
{_T("655555777877"),_T("190011333322")},
{_T("546555788877"),_T("091011333322")},
{_T("646566788987"),_T("091012333432")},
{_T("646566888988"),_T("191122343432")},
{_T("655455777877"),_T("190011333322")},
{_T("546556778877"),_T("091011333322")},
{_T("646566788887"),_T("091012333432")},
{_T("646566888988"),_T("191112343432")},
{_T("655455777877"),_T("190011333322")},
{_T("546556778877"),_T("091011333322")},
{_T("646566788887"),_T("091012333422")},
{_T("646566888988"),_T("091012343432")},
{_T("645455777877"),_T("190011233322")},
{_T("545556778877"),_T("091011333322")},
{_T("546566788887"),_T("091012333422")},
{_T("646566788987"),_T("091012343432")},
{_T("645455777877"),_T("190011233321")},
{_T("545556777877"),_T("090011333322")},
{_T("546566788887"),_T("091011333422")},
{_T("646566788987"),_T("091012333432")},
{_T("645455777877"),_T("190011233321")},
{_T("545556777877"),_T("080011333322")},
{_T("546566788877"),_T("091011333322")},
{_T("646566788987"),_T("091012333432")},
{_T("645455777877"),_T("190011233321")},
{_T("545555777877"),_T("080011333322")},
{_T("546566788877"),_T("091011333322")},
{_T("646566788987"),_T("091012333432")},
{_T("645455777877"),_T("190011233321")}
};
// {Yin Festivals}
const int YinFestivalCount = 8;
const int YinFestivalMonth[YinFestivalCount]=
{1, 1, 2, 5, 7, 8, 9, 12};
const int YinFestivalDay[YinFestivalCount]=
{1, 15, 2, 5, 7, 15, 9, 8 };
const CString YinFestivalName[YinFestivalCount]=
{
_T("春节"),_T("元宵节"),_T("中和节"),_T("端午节"),_T("七夕"),
_T("中秋节"),_T("重阳节"),_T("腊八节")
};
// {Yang Festivals}
const int YangFestivalCount = 46;
const int YangFestivalMonth[YangFestivalCount]=
{1,2, 3,3,3, 3, 3, 3, 4,4,4, 4, 5,5,5,5, 5, 5, 5, 6,6,6,6, 6, 7,7,7, 8,9,
9, 9, 9, 9, 10,10,10,10,10,10,10,11,11,11,12,12,12};
const int YangFestivalDay[YangFestivalCount]=
{1,14,5,8,12,15,23,31,1,7,22,23,1,4,8,12,15,17,19,1,5,6,25,26,1,7,11,1,8,
10,20,27,28, 1,4,8,9, 14,16,24,1, 2, 17,5, 25,26};
const CString YangFestivalName[YangFestivalCount]=
{
_T("元旦"),_T("情人节"),_T("学雷锋纪念日"),_T("国际劳动妇女节"),
_T("植树节"),_T("国际消费者权益日"),_T("国际气象日"),_T("安全教育日"),
_T("愚人节"),_T("世界卫生日"),_T("世界地球日"),_T("莎士比亚节"),
_T("国际劳动节"),_T("青年节"),_T("世界红十字日"),_T("国际护士节"),
_T("国际家庭日"),_T("国际电信日"),_T("全国助残日"),_T("国际儿童节"),
_T("国际环境保护日"),_T("全国爱眼日"),_T("全国土地日"),_T("国际禁毒日"),
_T("党的生日,香港回归日"),_T("中国人民抗日战争纪念日"),
_T("世界人口日"),_T("建军节"),_T("国际扫盲日,国际新闻工作者团结日"),
_T("中国教师节"),_T("全国爱牙日"),_T("世界旅游日"),
_T("国际聋人日"),_T("国庆节,国际音乐日"),_T("世界动物日"),
_T("全国高血压日"),_T("世界邮政日"),_T("世界标准日"),
_T("世界粮食日"),_T("联合国日"),_T("万圣节"),
_T("万灵节"),_T("国际学生日"),_T("国际志愿人员日"),
_T("圣诞节"),_T("圣诞节送礼日")
};
BOOL DateYang2Yin(CTime dYang,int& yYin,int& mYin,int& dYin,BOOL& bLeapMonth);
BOOL DateYin2Yang(int yYin,int mYin,int dYin,BOOL bLeapMonth,CTime& dYang);
CString DateYin2GanZhi(int yYin,int mYin,int dYin,BOOL bLeapMonth);
CString YearYin2GanZhi(int yYin);
void GetGanZhi(LONG l,int& g,int& z );
int YinYear2Animal(int yYin);
CString YearName(CTime dateYang,int yYin );
CString YinFestival(int mYin,int dYin,BOOL bLeapMonth );
CString YangFestival(int y,int m,int d );
CString DateYang2JieQi(CTime dYang );
BOOL IsLeapYear(int AYear);
CString CDayOfWeek(CTime date);
int DaysOfYinMonth(int yYin,int mYin);
LONG DaysOfYinYear(int y);
LONG CalcYinDatesSpan(int Y,int M,int D,BOOL bLeapMonth,int y1,int m1,int d1,BOOL bLeapMonth1);
//Tian Add:
CTime EncodeDate(int y,int m,int d);
void DecodeDate(CTime dYang,int& y,int& m,int& d );
int DayOfWeek(CTime);
CTime EncodeDate(int y,int m,int d)
{
return CTime(y,m,d,8,8,8);
}
void DecodeDate(CTime dYang,WORD& y,WORD& m,WORD& d )
{
y=dYang.GetYear();
m=dYang.GetMonth();
d=dYang.GetDay();
}
int DayOfWeek(CTime t)
{
return t.GetDayOfWeek( );
}
BOOL DateYang2Yin(CTime dYang,int& yYin,int& mYin,int& dYin,BOOL& bLeapMonth)
{
int lDaySpan;
CTime dYangBase;
WORD y, m, d;
//{0.Is year valid?}
DecodeDate(dYang,y,m,d);
if (y<YEAR_START||y>YEAR_END) return 0;
//{1.Calc gap from dYang to YangDateBase}
dYangBase =EncodeDate(YangDateBase[YEAR],YangDateBase[MONTH],YangDateBase[DAY]);
CTimeSpan ts = dYang - dYangBase;
lDaySpan = ts.GetDays();
//{2.Plus the gap to YinDateBase}
yYin = YinDateBase[YEAR];
mYin = YinDateBase[MONTH];
dYin = YinDateBase[DAY];
if ((LeapMonthOfYear[yYin-YEAR_START] >0 ) &&((LeapMonthOfYear[yYin-YEAR_START] <mYin ) ||
(bYinBaseLeapMonth && (LeapMonthOfYear[yYin-YEAR_START] == mYin))))
mYin = mYin +1;
if( lDaySpan > 0 )
{//{Adjust the YinDateBase's Day to 1}
lDaySpan = lDaySpan + dYin -1;
dYin = 1;
while ( lDaySpan >= DaysOfYinMonth( yYin, mYin ) )
{
if ( DaysOfYinMonth( yYin, mYin ) < 29 )
return 0;
lDaySpan = lDaySpan - DaysOfYinMonth( yYin, mYin );
mYin = mYin + 1;
if (( mYin > 13 ) || ( (mYin == 13)&&(LeapMonthOfYear[yYin-YEAR_START] == 0) ))
{
mYin = 1;
yYin = yYin + 1;
}
}
dYin = dYin + lDaySpan;
}
else if( lDaySpan < 0 )
{
lDaySpan = lDaySpan*(-1);
// {Adjust the YinDateBase's Day to 1 of next month}
lDaySpan = lDaySpan + DaysOfYinMonth( yYin, mYin ) - dYin +1;
dYin = 1;
while ( lDaySpan > DaysOfYinMonth( yYin, mYin ) )
{
if ( DaysOfYinMonth( yYin, mYin ) < 29 )
return 0;
lDaySpan = lDaySpan - DaysOfYinMonth( yYin, mYin );
mYin = mYin - 1;
if ( mYin == 0 )
{
yYin = yYin - 1;
if ( LeapMonthOfYear[yYin-YEAR_START] > 0 )
mYin = 13;
else
mYin = 12;
}
}
dYin = DaysOfYinMonth( yYin, mYin ) - lDaySpan +1;
}
//{3.Return the result Yin date}
if ((LeapMonthOfYear[yYin-YEAR_START] >0 ) && (LeapMonthOfYear[yYin-YEAR_START] < mYin ))
{
mYin = mYin -1;
bLeapMonth = ( LeapMonthOfYear[yYin-YEAR_START] == mYin );
}
else
bLeapMonth = FALSE;
return 1;
}
BOOL DateYin2Yang(int yYin,int mYin,int dYin,BOOL bLeapMonth,CTime& dYang)
{
LONG lDaySpan;
CTime dYangBase;
//{0.Is year valid?}
//{1.Calc gap from Yin date to YinDateBase}
lDaySpan = CalcYinDatesSpan( yYin, mYin, dYin, bLeapMonth,
YinDateBase[YEAR],YinDateBase[MONTH], YinDateBase[DAY],
bYinBaseLeapMonth );
//{2.Add the gap to YangDateBase}
dYangBase =EncodeDate(YangDateBase[YEAR],YangDateBase[MONTH],YangDateBase[DAY]);
//dYang = dYangBase + lDaySpan;
//CTimeSpan( LONG lDays, int nHours, int nMins, int nSecs );
CTimeSpan ts(lDaySpan,0,0,0);
dYang = dYangBase + ts;
return 1;
}
int YinYear2Animal(int yYin)
{
int result = ( yYin - YinDateBase[YEAR] + YinAnimalBase ) % 12;
if (result <= 0) result = result + 12;
return result;
}
CString YearName(CTime dateYang,int yYin )
{
TCHAR tc[20];
CString result;
const int YinYears[3] =
{1875,1909,1912};
const CString YearNames[3]= {_T("光绪"),_T("宣统"),_T("民国")};
const int MinGuoYear[2]= {1912, 1949};
WORD y,m,d;
//{Compare Yin year}
if (yYin < YinYears[0]) result = "";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -