Beispiel #1
0
        public static LunarDate SolarToLunar(DateTime date, int timeZone)
        {
            long k, dayNumber, monthStart, a11, b11, lunarDay, lunarMonth, lunarYear, diff, leapMonthDiff;
            bool lunarLeap;

            dayNumber  = LunarYearTools.jdFromDate(date.Day, date.Month, date.Year);
            k          = LunarYearTools.INT((dayNumber - 2415021.076998695) / 29.530588853);
            monthStart = LunarYearTools.getNewMoonDay(k + 1, timeZone);
            if (monthStart > dayNumber)
            {
                monthStart = LunarYearTools.getNewMoonDay(k, timeZone);
            }
            // alert(dayNumber+" -> "+monthStart);
            a11 = LunarYearTools.getLunarMonth11(date.Year, timeZone);
            b11 = a11;
            if (a11 >= monthStart)
            {
                lunarYear = date.Year;
                a11       = LunarYearTools.getLunarMonth11(date.Year - 1, timeZone);
            }
            else
            {
                lunarYear = date.Year + 1;
                b11       = LunarYearTools.getLunarMonth11(date.Year + 1, timeZone);
            }
            lunarDay   = dayNumber - monthStart + 1;
            diff       = LunarYearTools.INT((monthStart - a11) / 29);
            lunarLeap  = false;
            lunarMonth = diff + 11;
            if (b11 - a11 > 365)
            {
                leapMonthDiff = LunarYearTools.getLeapMonthOffset(a11, timeZone);
                if (diff >= leapMonthDiff)
                {
                    lunarMonth = diff + 10;
                    if (diff == leapMonthDiff)
                    {
                        lunarLeap = true;
                    }
                }
            }
            if (lunarMonth > 12)
            {
                lunarMonth = lunarMonth - 12;
            }
            if (lunarMonth >= 11 && diff < 4)
            {
                lunarYear -= 1;
            }
            return(new LunarDate((int)lunarDay, (int)lunarMonth, (int)lunarYear, lunarLeap));
        }