public static int getLunarMonth11(int yy, double timeZone) { double off = (VietCalendar.jdFromDate(31, 12, yy) - 2415021.0769986948); int k = VietCalendar.INT((off / 29.530588853)); int nm = VietCalendar.getNewMoonDay(k, timeZone); int sunLong = VietCalendar.INT((VietCalendar.getSunLongitude(nm, timeZone) / 30)); if ((sunLong >= 9)) { nm = VietCalendar.getNewMoonDay((k - 1), timeZone); } return(nm); }
// Duong lich sang Am lich public static int[] convertSolar2Lunar(int dd, int mm, int yy, double timeZone) { int lunarLeap; int lunarDay; int lunarMonth; int lunarYear; int dayNumber = VietCalendar.jdFromDate(dd, mm, yy); int k = VietCalendar.INT(((dayNumber - 2415021.0769986948) / 29.530588853)); int monthStart = VietCalendar.getNewMoonDay((k + 1), timeZone); if ((monthStart > dayNumber)) { monthStart = VietCalendar.getNewMoonDay(k, timeZone); } int a11 = VietCalendar.getLunarMonth11(yy, timeZone); int b11 = a11; if ((a11 >= monthStart)) { lunarYear = yy; a11 = VietCalendar.getLunarMonth11((yy - 1), timeZone); } else { lunarYear = (yy + 1); b11 = VietCalendar.getLunarMonth11((yy + 1), timeZone); } lunarDay = ((dayNumber - monthStart) + 1); int diff = VietCalendar.INT(((monthStart - a11) / 29)); lunarLeap = 0; lunarMonth = (diff + 11); if (((b11 - a11) > 365)) { int leapMonthDiff = VietCalendar.getLeapMonthOffset(a11, timeZone); if ((diff >= leapMonthDiff)) { lunarMonth = (diff + 10); if ((diff == leapMonthDiff)) { lunarLeap = 1; } } } if ((lunarMonth > 12)) { lunarMonth = (lunarMonth - 12); } if (((lunarMonth >= 11) && (diff < 4))) { lunarYear--; } return(new int[] { lunarDay, lunarMonth, lunarYear, lunarLeap }); }