2299160) { // After 5/10/1582, Gregorian calendar \$a = \$jd + 32044; \$b = INT((4*\$a+3)/146097); \$c = \$a - INT((\$b*146097)/4); } else { \$b = 0; \$c = \$jd + 32082; } \$d = INT((4*\$c+3)/1461); \$e = \$c - INT((1461*\$d)/4); \$m = INT((5*\$e+2)/153); \$day = \$e - INT((153*\$m+2)/5) + 1; \$month = \$m + 3 - 12*INT(\$m/10); \$year = \$b*100 + \$d - 4800 + INT(\$m/10); //echo "day = \$day, month = \$month, year = \$year\n"; return array(\$day, \$month, \$year); } function getNewMoonDay(\$k, \$timeZone) { \$T = \$k/1236.85; // Time in Julian centuries from 1900 January 0.5 \$T2 = \$T * \$T; \$T3 = \$T2 * \$T; \$dr = M_PI/180; \$Jd1 = 2415020.75933 + 29.53058868*\$k + 0.0001178*\$T2 - 0.000000155*\$T3; \$Jd1 = \$Jd1 + 0.00033*sin((166.56 + 132.87*\$T - 0.009173*\$T2)*\$dr); // Mean new moon \$M = 359.2242 + 29.10535608*\$k - 0.0000333*\$T2 - 0.00000347*\$T3; // Sun's mean anomaly \$Mpr = 306.0253 + 385.81691806*\$k + 0.0107306*\$T2 + 0.00001236*\$T3; // Moon's mean anomaly \$F = 21.2964 + 390.67050646*\$k - 0.0016528*\$T2 - 0.00000239*\$T3; // Moon's argument of latitude \$C1=(0.1734 - 0.000393*\$T)*sin(\$M*\$dr) + 0.0021*sin(2*\$dr*\$M); \$C1 = \$C1 - 0.4068*sin(\$Mpr*\$dr) + 0.0161*sin(\$dr*2*\$Mpr); \$C1 = \$C1 - 0.0004*sin(\$dr*3*\$Mpr); \$C1 = \$C1 + 0.0104*sin(\$dr*2*\$F) - 0.0051*sin(\$dr*(\$M+\$Mpr)); \$C1 = \$C1 - 0.0074*sin(\$dr*(\$M-\$Mpr)) + 0.0004*sin(\$dr*(2*\$F+\$M)); \$C1 = \$C1 - 0.0004*sin(\$dr*(2*\$F-\$M)) - 0.0006*sin(\$dr*(2*\$F+\$Mpr)); \$C1 = \$C1 + 0.0010*sin(\$dr*(2*\$F-\$Mpr)) + 0.0005*sin(\$dr*(2*\$Mpr+\$M)); if (\$T < -11) { \$deltat= 0.001 + 0.000839*\$T + 0.0002261*\$T2 - 0.00000845*\$T3 - 0.000000081*\$T*\$T3; } else { \$deltat= -0.000278 + 0.000265*\$T + 0.000262*\$T2; }; \$JdNew = \$Jd1 + \$C1 - \$deltat; //echo "JdNew = \$JdNew\n"; return INT(\$JdNew + 0.5 + \$timeZone/24); } function getSunLongitude(\$jdn, \$timeZone) { \$T = (\$jdn - 2451545.5 - \$timeZone/24) / 36525; // Time in Julian centuries from 2000-01-01 12:00:00 GMT \$T2 = \$T * \$T; \$dr = M_PI/180; // degree to radian \$M = 357.52910 + 35999.05030*\$T - 0.0001559*\$T2 - 0.00000048*\$T*\$T2; // mean anomaly, degree \$L0 = 280.46645 + 36000.76983*\$T + 0.0003032*\$T2; // mean longitude, degree \$DL = (1.914600 - 0.004817*\$T - 0.000014*\$T2)*sin(\$dr*\$M); \$DL = \$DL + (0.019993 - 0.000101*\$T)*sin(\$dr*2*\$M) + 0.000290*sin(\$dr*3*\$M); \$L = \$L0 + \$DL; // true longitude, degree //echo "\ndr = \$dr, M = \$M, T = \$T, DL = \$DL, L = \$L, L0 = \$L0\n"; // obtain apparent longitude by correcting for nutation and aberration \$omega = 125.04 - 1934.136 * T; \$L = \$L - 0.00569 - 0.00478 * Math.sin(\$omega * \$dr); \$L = \$L*\$dr; \$L = \$L - M_PI*2*(INT(\$L/(M_PI*2))); // Normalize to (0, 2*PI) return INT(\$L/M_PI*6); } function getLunarMonth11(\$yy, \$timeZone) { \$off = jdFromDate(31, 12, \$yy) - 2415021; \$k = INT(\$off / 29.530588853); \$nm = getNewMoonDay(\$k, \$timeZone); \$sunLong = getSunLongitude(\$nm, \$timeZone); // sun longitude at local midnight if (\$sunLong >= 9) { \$nm = getNewMoonDay(\$k-1, \$timeZone); } return \$nm; } function getLeapMonthOffset(\$a11, \$timeZone) { \$k = INT((\$a11 - 2415021.076998695) / 29.530588853 + 0.5); \$last = 0; \$i = 1; // We start with the month following lunar month 11 \$arc = getSunLongitude(getNewMoonDay(\$k + \$i, \$timeZone), \$timeZone); do { \$last = \$arc; \$i = \$i + 1; \$arc = getSunLongitude(getNewMoonDay(\$k + \$i, \$timeZone), \$timeZone); } while (\$arc != \$last && \$i < 14); return \$i - 1; } /* Comvert solar date dd/mm/yyyy to the corresponding lunar date */ function convertSolar2Lunar(\$dd, \$mm, \$yy, \$timeZone) { \$dayNumber = jdFromDate(\$dd, \$mm, \$yy); \$k = INT((\$dayNumber - 2415021.076998695) / 29.530588853); \$monthStart = getNewMoonDay(\$k+1, \$timeZone); if (\$monthStart > \$dayNumber) { \$monthStart = getNewMoonDay(\$k, \$timeZone); } \$a11 = getLunarMonth11(\$yy, \$timeZone); \$b11 = \$a11; if (\$a11 >= \$monthStart) { \$lunarYear = \$yy; \$a11 = getLunarMonth11(\$yy-1, \$timeZone); } else { \$lunarYear = \$yy+1; \$b11 = getLunarMonth11(\$yy+1, \$timeZone); } \$lunarDay = \$dayNumber - \$monthStart + 1; \$diff = INT((\$monthStart - \$a11)/29); \$lunarLeap = 0; \$lunarMonth = \$diff + 11; if (\$b11 - \$a11 > 365) { \$leapMonthDiff = 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 -= 1; } return array(\$lunarDay, \$lunarMonth, \$lunarYear, \$lunarLeap); } /* Convert a lunar date to the corresponding solar date */ function convertLunar2Solar(\$lunarDay, \$lunarMonth, \$lunarYear, \$lunarLeap, \$timeZone) { if (\$lunarMonth < 11) { \$a11 = getLunarMonth11(\$lunarYear-1, \$timeZone); \$b11 = getLunarMonth11(\$lunarYear, \$timeZone); } else { \$a11 = getLunarMonth11(\$lunarYear, \$timeZone); \$b11 = getLunarMonth11(\$lunarYear+1, \$timeZone); } \$k = INT(0.5 + (\$a11 - 2415021.076998695) / 29.530588853); \$off = \$lunarMonth - 11; if (\$off < 0) { \$off += 12; } if (\$b11 - \$a11 > 365) { \$leapOff = getLeapMonthOffset(\$a11, \$timeZone); \$leapMonth = \$leapOff - 2; if (\$leapMonth < 0) { \$leapMonth += 12; } if (\$lunarLeap != 0 && \$lunarMonth != \$leapMonth) { return array(0, 0, 0); } else if (\$lunarLeap != 0 || \$off >= \$leapOff) { \$off += 1; } } \$monthStart = getNewMoonDay(\$k + \$off, \$timeZone); return jdToDate(\$monthStart + \$lunarDay - 1); } ?>

### Đổi ngày dương ra ngày âm

\n"; echo "Ngày: \n"; echo "Tháng: \n"; echo "Năm: \n"; echo "\n"; echo "
\n"; echo "Dương lịch: \$dd/\$mm/\$yy => "; \$s = "Âm lịch: \$al[0]/\$al[1]/\$al[2]"; if (\$al[3] == 1) \$s = \$s . " nhuận"; echo "\$s\n"; ?>