📄 pubdata.h
字号:
#ifndef _PUBDATA_H_
#define _PUBDATA_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 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
};
BOOL DateYang2Yin(int yYang,int mYang,int dYang,int& yYin,int& mYin,int& dYin,BOOL& bLeapMonth);
BOOL DateYin2Yang(int yYin,int mYin,int dYin,BOOL bLeapMonth,int& yYang,int& mYang,int& dYang);
CString YearName(int yYang,int mYang,int dYang,int yYin );
int CalcYangDays(int y1,int m1,int d1);
int CalcNewYangWithDays(int days,int& y,int& m,int& d);
int CalcNewYangWithDaysLess365(int year,int days,int& y,int& m,int& d);
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);
BOOL IsLeapYear(int AYear);
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);
int CalcYangDays(int endY,int endM,int endD)
{
int i,leapYearNum=0;
for(i=1;i<endY;i++)
{
if(IsLeapYear(i))
leapYearNum++;
}
int day1=endY*365+leapYearNum;
int day2=0;
for(i=1;i<endM;i++)
{
if((i==1)||(i==3)||(i==5)||(i==7)||(i==8)||(i==10)||(i==12))
day2+=31;
else
{
if(i!=2)
day2+=30;
else
if(IsLeapYear(endY))
day2+=29;
else
day2+=28;
}
}
day1+=day2+endD;
return day1;
}
BOOL DateYang2Yin(int yYang,int mYang,int dYang,int& yYin,int& mYin,int& dYin,BOOL& bLeapMonth)
{
int lDaySpan;
int y, m, d;
//{0.Is year valid?}
if (yYang<YEAR_START||yYang>YEAR_END) return 0;
//{1.Calc gap from dYang to YangDateBase}
int test1 = CalcYangDays(YangDateBase[YEAR],YangDateBase[MONTH],YangDateBase[DAY]);
int test2 = CalcYangDays(yYang,mYang,dYang);
lDaySpan = test2-test1;
//{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,int& yYang,int& mYang,int& 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}
//CTimeSpan
int d1=CalcYangDays(YangDateBase[YEAR],YangDateBase[MONTH],YangDateBase[DAY]);
int test=CalcNewYangWithDays(d1,yYang,mYang,dYang);
d1+=lDaySpan;
return CalcNewYangWithDays(d1,yYang,mYang,dYang);
}
int YinYear2Animal(int yYin)
{
int result = ( yYin - YinDateBase[YEAR] + YinAnimalBase ) % 12;
if (result <= 0) result = result + 12;
return result;
}
CString YearName(int yYang,int mYang,int dYang,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 = "";
else
if (yYin == YinYears[0]) result = YearNames[0]+_T("元年 ");
else
if (yYin < YinYears[1] )
{
//result =Format(_T("%s%d年 "), [YearNames[1], yYin-YinYears[1]+1 ]);
wsprintf(tc,_T("%d"),yYin-YinYears[0]+1);
result =YearNames[0]+tc+_T("年 ");
}
else
if (yYin == YinYears[1]) result = YearNames[1]+_T("元年 ");
else
if (yYin < YinYears[2] )
{
// result =Format("%s%d年 ", [YearNames[2], yYin-YinYears[2]+1 ]);
wsprintf(tc,_T("%d"),yYin-YinYears[1]+1);
result =YearNames[1]+tc+_T("年 ");
}
else result = "";
//{Compare Yang year}
// DecodeDate( dateYang, y, m, d );
y=yYang;
m=mYang;
d=dYang;
if (y < MinGuoYear[0])return "";
else
if (y == MinGuoYear[0]) result = YearNames[2]+_T("元年 ");
else
if (y < MinGuoYear[1] )
{
//result =Format("%s%d年 ", [YearNames[3], y-MinGuoYear[1]+1 ]);
wsprintf(tc,_T("%d"),y-MinGuoYear[0]+1);
result =YearNames[2]+tc+_T("年 ");
}
else result = "";
return result;
}
BOOL IsLeapYear(int AYear)
{
return (AYear % 4 == 0) && ((AYear % 100 != 0) || (AYear % 400 == 0));
}
int DaysOfYinMonth(int yYin,int mYin)
{
int n,result;
// {NOTE: If 4th month is lunar(two 4th), mYin=7 means 6th month! }
// {Is year/month valid? }
if ((yYin<YEAR_START) || (yYin>YEAR_END) ||
(mYin<1) || (mYin>13) ||
( (mYin==13) && (LeapMonthOfYear[yYin-YEAR_START]==0) ))
{
result = 0;
return result;
}
n = YinMonthsOfYear[yYin-YEAR_START];
n = n >> (mYin-1);
if ( n & 0x1 == 1 )
result = 30; //{大月}
else
result = 29;// {小月}
return result;
}
LONG DaysOfYinYear( int y )
{
int m;
LONG result = 0;
for (m= 1;m<=13;m++)
result = result + DaysOfYinMonth( y, m );
return result;
}
LONG CalcYinDatesSpan(int Y,int M,int D,BOOL bLeapMonth,
int y1,int m1,int d1,BOOL bLeapMonth1 )
//{Calc the days count between two Yin dates: return (YMD-ymd) }
{
int nTotalSign, nDays_md1, nDays_MD, k, t;
LONG lTotalDays,result;
if ((LeapMonthOfYear[Y-YEAR_START] > 0) && ((LeapMonthOfYear[Y-YEAR_START] < M ) ||
(bLeapMonth && (LeapMonthOfYear[Y-YEAR_START] == M)))) M = M + 1;
if ((LeapMonthOfYear[y1-YEAR_START] > 0) && ((LeapMonthOfYear[y1-YEAR_START] < m1 )||
(bLeapMonth1 && (LeapMonthOfYear[y1-YEAR_START] == m1)))) m1 = m1 + 1;
if( y1 < Y ) nTotalSign = 1;
else if( y1 > Y ) nTotalSign = -1;
else if( m1 < M ) nTotalSign = 1;
else if( m1 > M ) nTotalSign = -1;
else if( d1 < D ) nTotalSign = 1;
else if( d1 > D ) nTotalSign = -1;
else
{
result = 0;// {the same dates!}
return result;
}
//{Assume YMD as Base Date and make sure YMD > ymd}
if( nTotalSign == -1 )
{
t = Y;
Y = y1;
y1 = t;
t = M;
M = m1;
m1 = t;
t = D;
D = d1;
d1 = t;
}
//{Calc days between ymd and y11}
nDays_md1 = 0;
for( k=1;k<=m1-1;k++)
nDays_md1 = nDays_md1 + DaysOfYinMonth( y1, k );
nDays_md1 = nDays_md1 + d1;
//{Calc days between YMD and Y11}
nDays_MD = 0;
for (k=1;k<=M-1;k++)
nDays_MD = nDays_MD + DaysOfYinMonth( Y, k );
nDays_MD = nDays_MD + D;
//{Calc the total days between YMD and ymd}
lTotalDays = 0;
for (k=y1;k<=Y-1;k++)
lTotalDays = lTotalDays + DaysOfYinYear( k );
lTotalDays = lTotalDays + nDays_MD - nDays_md1;
lTotalDays = lTotalDays * nTotalSign;
result = lTotalDays;
return result;
}
CString MonthYin2GanZhi(int yYin,int mYin)
{
int nSign, y, m, t, n, g, z;
LONG lMonths;
//{NOTE: Yin leap month has same GanZhi with its prev
// month, so we can say that every Yin year has 12 months here.}
y = YinDateBase[YEAR];
m = YinDateBase[MONTH];
if (yYin > y) nSign = 1;
else if (yYin < y) nSign = -1;
else if (mYin > m ) nSign = 1;
else if (mYin < m ) nSign = -1;
else
{
nSign = 1;
n = YinGanZhiBase[MONTH];
}
//{Make sure that yYin.mYin >= y.m }
if (nSign == -1)
{
t = yYin;
yYin = y;
y = t;
t = mYin;
mYin = m;
m = t;
}
lMonths = ( (yYin - y)*12 + mYin - m )* nSign + YinGanZhiBase[MONTH];
GetGanZhi( lMonths, g, z );
return TianGan[g-1] + DiZhi[z-1];
}
CString YearYin2GanZhi(int yYin)
{
LONG lYears;
int g, z;
lYears = yYin - YinDateBase[YEAR] + YinGanZhiBase[YEAR];
GetGanZhi( lYears, g, z );
return TianGan[g-1] + DiZhi[z-1];
}
void GetGanZhi(LONG l,int& g,int& z )
{
g =l%10;
if (g <= 0) g = g + 10;
z = l % 12;
if (z <= 0) z = z + 12;
}
CString DateYin2GanZhi(int yYin,int mYin,int dYin,BOOL bLeapMonth)
{
//int lDays;
LONG lDays;
int g, z;
lDays = CalcYinDatesSpan( yYin, mYin, dYin,bLeapMonth,
YinDateBase[YEAR],YinDateBase[MONTH], YinDateBase[DAY],
bYinBaseLeapMonth ) + YinGanZhiBase[DAY];
GetGanZhi( lDays, g, z );
return TianGan[g-1] + DiZhi[z-1];
}
int CalcNewYangWithDaysLess365(int year,int days,int& y,int& m,int& d)//0,0,0 as base yang year
{
if(days<1)
{
if(IsLeapYear(year))
days=366+days;
else
days=365+days;
year--;
CalcNewYangWithDaysLess365(year,days,y,m,d);
return 1;
}
//days>0:
y=year;
m=12;
d=31;
int i;
m=0;
d=0;
y++;
for(i=1;i<13;i++)
{
if((i==1)||(i==3)||(i==5)||(i==7)||(i==8)||(i==10)||(i==12))
{
if(days>31)
days-=31;
else
{
m=i;
d=days;
break;
}
}
else
{
if(i!=2)//4,6,9,11
{
if(days>30)
days-=30;
else
{
m=i;
d=days;
break;
}
}
else
{
if(IsLeapYear(y))
{
if(days>29)
days-=29;
else
{
m=i;
d=days;
break;
}
}
else
{
if(days>28)
days-=28;
else
{
m=i;
d=days;
break;
}
}
}
}
m=i;
}
return 1;
}
int CalcNewYangWithDays(int days,int& y,int& m,int& d)//0,0,0 as base yang year
{
int i=0;
int num=days/365-1;
if(num<0)return 0;
int leftDays=days-(num+1)*365;
int leapYearNum=0;
for(i=1;i<=num;i++)
{
if(IsLeapYear(i))
leapYearNum++;
}
if(leftDays>=leapYearNum)
{
leftDays=leftDays-leapYearNum;
CalcNewYangWithDaysLess365(num,leftDays,y,m,d);
}
else//leftDays<leapYearNum
{
if(IsLeapYear(num))
leapYearNum--;
num=num-1;
leftDays=365+leftDays-leapYearNum;
CalcNewYangWithDaysLess365(num,leftDays,y,m,d);
}
return 1;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -