📄 yinyang.h
字号:
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 );
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;
}
CString YinFestival(int mYin,int dYin,BOOL bLeapMonth )
{
int i;
CString result = "";
if ( bLeapMonth == TRUE ) return "";
for (i =0;i<YinFestivalCount;i++)
{
if (( mYin == YinFestivalMonth[i] )&&( dYin == YinFestivalDay[i] ) )
{
result = " (" + YinFestivalName[i] + ")";
break;
}
}
return result;
}
CString YangFestival(int y,int m,int d)
{
int i, yYin,mYin,dYin, y2, m2, d2, nGap;
BOOL bLeapM;
CString s;
CString result = "";
//{Fixed-date festivals}
for (i =0 ;i<YangFestivalCount;i++)
{
if ( (m == YangFestivalMonth[i] ) &&( d == YangFestivalDay[i] ))
{
result = YangFestivalName[i];
break;
}
}
//{Variable-date festivals 以下是日期不固定的节日:
// 复活节: 3月21日月圆后(当天非月圆时,延后至月圆后)的第一个星期日
// 母亲节: 5月的第二个星期日
// 父亲节: 6月的第三个星期日
// 感恩节: 11月的第四个星期四(美国) }
s = "";
switch(m)
{
case 3:
case 4:
if ((DayOfWeek( EncodeDate(y,m,d)) == 1) &&// {Is Sunday}
( DateYang2Yin( EncodeDate(y,3,21), yYin,mYin,dYin,bLeapM ) == TRUE ))
{
y2 = y;
m2 = 3;
d2 = 21;
//{1.Calc midmonth day after 3.21 first}
if( dYin <= 15) nGap = 15- dYin;
else nGap = DaysOfYinMonth( yYin, mYin )- dYin + 15;
d2 = d2 + nGap;
if (d2 > 31)
{
m2 = m2 + 1;
d2 = d2 - 31;
}
//{2. Then calc Sunday after the midmonth day}
d2= d2 + 8- DayOfWeek( EncodeDate(y2,m2,d2) );
if ((m2 == 3) &&(d2 > 31))
{
m2 = m2 + 1;
d2 = d2 - 31;
}
if ((m2 == m) && (d2 == d))
s = "复活节";
}
case 5: if ((d>7 ) && (d<15) && (DayOfWeek( EncodeDate(y,m,d)) == 1))
s = "母亲节";
case 6: if ((d>14) &&(d<22) && (DayOfWeek( EncodeDate(y,m,d)) == 1))
s = "父亲节";
case 11:if ((d>21) && (d<29) && (DayOfWeek( EncodeDate(y,m,d)) == 5))
s = "感恩节";
}
if (s != "")
{
if (result != "") result = result + ", " + s;
else result = s;
}
return result;
}
CString DateYang2JieQi(CTime dYang ) //{98.3.19}
{
CString result;
WORD y,m,d;
WORD dJQ[2];
DecodeDate( dYang, y, m, d );
if (( y < JieQiStartYear ) ||( y > JieQiEndYear ))
{
result = "";
return result;
}
dJQ[1] = _ttoi( JieQiOfYear[y-JieQiStartYear,1][m]);//StrToInt( JieQiOfYear[y,1][m] );
dJQ[2] = _ttoi( JieQiOfYear[y-JieQiStartYear,2][m]);//StrToInt( JieQiOfYear[y,2][m] );
if (dJQ[2] < 7)
dJQ[2] = dJQ[2] + 20;
else
dJQ[2] = dJQ[2] + 10;
if ( d == dJQ[1] )
result = " (" + JieQi[ m*2 -1-JieQiStartYear ] + ")";
else if ( d == dJQ[2] )
result = " (" + JieQi[ m*2 -JieQiStartYear] + ")";
else
result = "";
return result;
}
BOOL IsLeapYear(int AYear)
{
return (AYear % 4 == 0) && ((AYear % 100 != 0) || (AYear % 400 == 0));
}
CString CDayOfWeek(CTime date)
{
CString result;
int n;
n = DayOfWeek( date );
if ((n<1) || (n>7))result = "";
else result = "星期" + CCweek[ n ];
return result;
}
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];
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -