void cyclical(long offset, char GanZhi[5]) {
long i = offset % 60;
if (i < 0)
i += 60;
strcpy(GanZhi, Gan[i%10]);
strcat(GanZhi, Zhi[i%12]);
}
void Lunar(int year, int month, int day, MyDate & dateOut)
{
int i;
int run=0, ping=0; // 闰年和平年个数
long temp;
long sum;
// 公历1900.1.31为农历的 乙亥年 戊寅月 甲辰日 正月初一
dateOut.monCyl = 14; // 戊寅月
dateOut.dayCyl = 40; // 甲辰日
if ( year>1900 || year==1900 && (month>1 || day==31) )
{
// 计算当前时间 和 1900.1.31 之间的天数差
for(i=1900; i<year; i++)
{
if(isleap(i))
run++;
else
ping++;
}
// 计算总天数
sum = 366*run + 365*ping;
for(i=1; i<month; i++)
sum += MonthDays(year, i);
sum += day;
sum -= 31;
dateOut.dayCyl += sum;
for(i=1900; i<TotalYear && sum>0; i++)
{
temp = lYearDays(i);
sum -= temp;
dateOut.monCyl += 12;
}
if(sum<0)
{
sum += temp;
i--;
dateOut.monCyl -= 12;
}
dateOut.year = i;
}
else // 1900.1.31日之前的公历日期
{
// 计算当前时间 和 1900.1.31 之间的天数差
if (year==1900) {
sum = 31-day;
}
else
{
for(i=1899; i>year; --i)
{
if(isleap(i))
run++;
else
ping++;
}
// 计算总天数
sum = 366*run + 365*ping;
for(i=month+1; i<13; ++i)
sum += MonthDays(year, i);
sum += MonthDays(year, month) - day;
sum +=31;
}
dateOut.dayCyl -= sum;
for(i=1899; i>=baseYear && sum>0; i--) {
sum -= lYearDays(i);
dateOut.monCyl -= 12;
}
if (sum<0) // 此处,如果sum 大于 0, 则出错,超出农历年的范围
sum = -sum;
dateOut.year = i+1;
}
int leap = leapMonth(dateOut.year); // 闰哪个月
for (i=1; i<13; ++i)
{
temp = monthDays(dateOut.year, i);
if (sum >= temp)
sum -= temp;
else
{
dateOut.month = i;
dateOut.day = sum + 1;
dateOut.isLeap = false;
break;
}
if (i == leap) // 闰月
{
temp = leapDays(dateOut.year);
if (sum >= temp)
sum -= temp;
else
{
dateOut.month = i;
dateOut.day = sum + 1;
dateOut.isLeap = true;
break;
}
}
dateOut.monCyl ++;
}
}