dontsayloveme2
Thành viên kỳ cựu
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;
}
Một Trung khí là thời điểm mà kinh độ mặt trời có một trong những giá trị sau: 0*PI/6, 1*PI/6, 2*PI/6, 3*PI/6, 4*PI/6, 5*PI/6, 6*PI/6, 7*PI/6, 8*PI/6, 9*PI/6, 10*PI/6, 11*PI/6. Các điểm "Phân-Chí" được định nghĩa bằng các tọa độ sau: Xuân phân: 0, Hạ chí: PI/2, Thu phân: PI, Đông chí: 3*PI/2.
Đông chí thường nằm vào khoảng 19/12-22/12, như vậy trước hết ta tìm ngày Sóc trước ngày 31/12. Nếu tháng bắt đầu vào ngày đó không chứa Đông chí thì ta phải lùi lại 1 tháng nữa.
điều đáng ngờ là
- cần xem kĩ lí do làm tròn số
- lại lấy sun longitude được làm tròn của ngày sóc thứ (k-1) và ngày sóc thứ k (làm tròn theo dương lịch)
sẽ sai như sau
- sun longitude đông chí lấy bằng 9; nếu sun longitude của ngày sóc thứ n lớn hơn 9 nhưng làm tròn bằng 9 thì sẽ coi đó là ngày sóc tháng 11, thực tế có thể đó là sóc tháng 12 hoặc tháng 11 nhuận.
- đúng ra phải so sánh trực tiếp ngày Julius (gồm phần sau dấu phẩy thể hiện giờ và phút) của điểm Khí và điểm Sóc.
$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;
}
Một Trung khí là thời điểm mà kinh độ mặt trời có một trong những giá trị sau: 0*PI/6, 1*PI/6, 2*PI/6, 3*PI/6, 4*PI/6, 5*PI/6, 6*PI/6, 7*PI/6, 8*PI/6, 9*PI/6, 10*PI/6, 11*PI/6. Các điểm "Phân-Chí" được định nghĩa bằng các tọa độ sau: Xuân phân: 0, Hạ chí: PI/2, Thu phân: PI, Đông chí: 3*PI/2.
Đông chí thường nằm vào khoảng 19/12-22/12, như vậy trước hết ta tìm ngày Sóc trước ngày 31/12. Nếu tháng bắt đầu vào ngày đó không chứa Đông chí thì ta phải lùi lại 1 tháng nữa.
điều đáng ngờ là
- cần xem kĩ lí do làm tròn số
- lại lấy sun longitude được làm tròn của ngày sóc thứ (k-1) và ngày sóc thứ k (làm tròn theo dương lịch)
sẽ sai như sau
- sun longitude đông chí lấy bằng 9; nếu sun longitude của ngày sóc thứ n lớn hơn 9 nhưng làm tròn bằng 9 thì sẽ coi đó là ngày sóc tháng 11, thực tế có thể đó là sóc tháng 12 hoặc tháng 11 nhuận.
- đúng ra phải so sánh trực tiếp ngày Julius (gồm phần sau dấu phẩy thể hiện giờ và phút) của điểm Khí và điểm Sóc.