當前位置:編程學習大全網 - 源碼下載 - 求“日梭萬年歷”網絡版源碼,或計算24節氣方法

求“日梭萬年歷”網絡版源碼,或計算24節氣方法

struct ConvDate

{

int Source;

int SolarYear;

int SolarMonth;

int SolarDate;

int LunarYear;

int LunarMonth;

int LunarDate;

int Weekday;

int Kan;

int Chih;

};

unsigned __int64 m_ui64SolarTerms[24];

unsigned __int64 m_ui64MonthDays[13];

m_ui64MonthDays[0] = 0ui64;

m_ui64MonthDays[1] = 31ui64;

m_ui64MonthDays[2] = 28ui64;

m_ui64MonthDays[3] = 31ui64;

m_ui64MonthDays[4] = 30ui64;

m_ui64MonthDays[5] = 31ui64;

m_ui64MonthDays[6] = 30ui64;

m_ui64MonthDays[7] = 31ui64;

m_ui64MonthDays[8] = 31ui64;

m_ui64MonthDays[9] = 30ui64;

m_ui64MonthDays[10] = 31ui64;

m_ui64MonthDays[11] = 30ui64;

m_ui64MonthDays[12] = 31ui64;

m_ui64SolarTerms[0] = 0ui64;

m_ui64SolarTerms[1] = 21208ui64;

m_ui64SolarTerms[2] = 42467ui64;

m_ui64SolarTerms[3] = 63836ui64;

m_ui64SolarTerms[4] = 85337ui64;

m_ui64SolarTerms[5] = 107014ui64;

m_ui64SolarTerms[6] = 128867ui64;

m_ui64SolarTerms[7] = 150921ui64;

m_ui64SolarTerms[8] = 173149ui64;

m_ui64SolarTerms[9] = 195551ui64;

m_ui64SolarTerms[10] = 218072ui64;

m_ui64SolarTerms[11] = 240693ui64;

m_ui64SolarTerms[12] = 263343ui64;

m_ui64SolarTerms[13] = 285989ui64;

m_ui64SolarTerms[14] = 308563ui64;

m_ui64SolarTerms[15] = 331033ui64;

m_ui64SolarTerms[16] = 353350ui64;

m_ui64SolarTerms[17] = 375494ui64;

m_ui64SolarTerms[18] = 397447ui64;

m_ui64SolarTerms[19] = 419210ui64;

m_ui64SolarTerms[20] = 440795ui64;

m_ui64SolarTerms[21] = 462224ui64;

m_ui64SolarTerms[22] = 483532ui64;

m_ui64SolarTerms[23] = 504758ui64;

/* 24節氣計算 */

int __fastcall IsLeapYear(int iYear)

{

if ((iYear & 3) != 0)

{

return 0;

}

else if (iYear % 100 != 0)

{

return 1;

}

else if (iYear % 400 == 0)

{

return 1;

}

else

{

return 0;

}

}

int __fastcall TheSolarTerm(int iYear, int n)

{

unsigned __int64 k;

unsigned __int64 ddate_utc = 22085493000000ui64;

unsigned __int64 doffdate, dadddate;

doffdate = m_ui64SolarTerms[n] * 600000ui64;

doffdate += static_cast<unsigned __int64>(iYear - 1900) * 315569259747ui64;

doffdate -= ddate_utc;

doffdate /= 864000000ui64; //86400: 60 * 60 * 24 * 1000

int i = 1969;

dadddate = 0ui64;

while (dadddate < doffdate)

{

i++;

k = dadddate;

dadddate += 365ui64 + static_cast<unsigned __int64>(IsLeapYear(i));

};

if (dadddate > doffdate)

{

int j = 0;

dadddate = k;

while (dadddate < doffdate && j < 12)

{

j++;

k = dadddate;

dadddate += m_ui64MonthDays[j];

if (j == 2 && (IsLeapYear(i) != 0))

{

dadddate++;

}

};

return static_cast<int>(doffdate - k + 1ui64);

}

else // j = doffdate

{

return 1;

}

}

int CalConv(struct ConvDate &cd)

{

int leap, d, sm, y, im, l1, l2, acc, i, lm, kc;

if (cd.Source == 0) /* Solar */

{

if (cd.SolarYear <= FIRSTYEAR || cd.SolarYear > LASTYEAR)

{

return 1;

}

sm = cd.SolarMonth - 1;

if (sm < 0 || sm > 11)

{

return 2;

}

leap = GetLeap(cd.SolarYear);

d = (sm == 1) ? (leap + 28) : SolarCal[sm];

if (cd.SolarDate < 1 || cd.SolarDate > d)

{

return 3;

}

y = cd.SolarYear - FIRSTYEAR;

acc = SolarDays[leap][sm] + cd.SolarDate;

cd.Weekday = (acc + LunarCal[y].BaseWeekday) % 7;

kc = acc + LunarCal[y].BaseKanChih;

cd.Kan = kc % 10;

cd.Chih = kc % 12;

if (acc <= LunarCal[y].BaseDays)

{

y--;

cd.LunarYear = cd.SolarYear - 1;

leap = GetLeap(cd.LunarYear);

sm += 12;

acc = SolarDays[leap][sm] + cd.SolarDate;

}

else

{

cd.LunarYear = cd.SolarYear;

}

l1 = LunarCal[y].BaseDays;

for (i = 0; i < 13; i++)

{

l2 = l1 + LunarCal[y].MonthDays[i] + 29;

if (acc <= l2)

{

break;

}

l1 = l2;

}

cd.LunarMonth = i + 1;

cd.LunarDate = acc - l1;

im = LunarCal[y].Intercalation;

if (im != 0 && cd.LunarMonth > im)

{

cd.LunarMonth--;

if (cd.LunarMonth == im)

{

cd.LunarMonth = -im;

}

}

if (cd.LunarMonth > 12)

{

cd.LunarMonth -= 12;

}

}

else /* Lunar */

{

if (cd.LunarYear < FIRSTYEAR || cd.LunarYear >= LASTYEAR)

{

return 1;

}

y = cd.LunarYear - FIRSTYEAR;

im = LunarCal[y].Intercalation;

lm = cd.LunarMonth;

if (lm < 0)

{

if (lm != -im)

{

return 2;

}

}

else if (lm < 1 || lm > 12)

{

return 2;

}

if (im != 0)

{

if (lm > im)

{

lm++;

}

else if (lm == -im)

{

lm = im + 1;

}

}

lm--;

if (cd.LunarDate > LunarCal[y].MonthDays[lm] + 29)

{

return 3;

}

acc = LunarCal[y].BaseDays;

for (i = 0; i < lm; i++)

{

acc += LunarCal[y].MonthDays[i] + 29;

}

acc += cd.LunarDate;

leap = GetLeap(cd.LunarYear);

for (i = 13; i >= 0; i--)

{

if (acc > SolarDays[leap][i])

{

break;

}

}

cd.SolarDate = acc - SolarDays[leap][i];

if (i <= 11)

{

cd.SolarYear = cd.LunarYear;

cd.SolarMonth = i + 1;

}

else

{

cd.SolarYear = cd.LunarYear + 1;

cd.SolarMonth = i - 11;

}

leap = GetLeap(cd.SolarYear);

y = cd.SolarYear - FIRSTYEAR;

acc = SolarDays[leap][cd.SolarMonth - 1] + cd.SolarDate;

cd.Weekday = (acc + LunarCal[y].BaseWeekday) % 7;

kc = acc + LunarCal[y].BaseKanChih;

cd.Kan = kc % 10;

cd.Chih = kc % 12;

}

return 0;

}

  • 上一篇:戰艦少女R版本v2.0.0.3建造時間表壹覽
  • 下一篇:初等教育:簡單有趣的科學實驗
  • copyright 2024編程學習大全網