Sieu ho tro Homepage
Forum Home Forum Home > General Knowledge > Things to know
  New Posts New Posts RSS Feed - m l?ch Vi?t Nam l m?t lo?i l?ch thin van. N du?c tnh ton d?a trn s? chuy?n d?ng c?a m?t tr?i, tri d?t v m?t trang. Ngy thng m l?ch du?c tnh d?a theo cc nguyn t?c sau
  FAQ FAQ  Forum Search   Events   Register Register  Login Login


�m l?ch Vi?t Nam l� m?t lo?i l?ch thi�n van. N� du?c t�nh to�n d?a tr�n s? chuy?n d?ng c?a m?t tr?i, tr�i d?t v� m?t trang. Ng�y th�ng �m l?ch du?c t�nh d?a theo c�c nguy�n t?c sau

 Post Reply Post Reply
Author
Message
administrator View Drop Down
Admin
Admin

ad

Joined: 14 October 2005
Status: Offline
Points: 512
Post Options Post Options   Thanks (0) Thanks(0)   Quote administrator Quote  Post ReplyReply Direct Link To This Post Topic: �m l?ch Vi?t Nam l� m?t lo?i l?ch thi�n van. N� du?c t�nh to�n d?a tr�n s? chuy?n d?ng c?a m?t tr?i, tr�i d?t v� m?t trang. Ng�y th�ng �m l?ch du?c t�nh d?a theo c�c nguy�n t?c sau
    Posted: 11 June 2009 at 09:34

Quy lu?t c?a �m l?ch Vi?t Nam
�m l?ch Vi?t Nam l� m?t lo?i l?ch thi�n van. N� du?c t�nh to�n d?a tr�n s? chuy?n d?ng c?a m?t tr?i, tr�i d?t v� m?t trang. Ng�y th�ng �m l?ch du?c t�nh d?a theo c�c nguy�n t?c sau:
1. Ng�y d?u ti�n c?a th�ng �m l?ch l� ng�y ch?a di?m S�c
2. M?t nam b�nh thu?ng c� 12 th�ng �m l?ch, m?t nam nhu?n c� 13 th�ng �m l?ch
3. ��ng ch� lu�n roi v�o th�ng 11 �m l?ch
4. Trong m?t nam nhu?n, n?u c� 1 th�ng kh�ng c� Trung kh� th� th�ng d� l� th�ng nhu?n. N?u nhi?u th�ng trong nam nhu?n d?u kh�ng c� Trung kh� th� ch? th�ng d?u ti�n sau ��ng ch� l� th�ng nhu?n
5. Vi?c t�nh to�n d?a tr�n kinh tuy?n 105� d�ng.
S�c l� th?i di?m h?i di?n, d� l� khi tr�i d?t, m?t trang v� m?t tr?i n?m tr�n m?t du?ng th?ng v� m?t trang n?m gi?a tr�i d?t v� m?t tr?i. (Nhu th? g�c gi?a m?t trang v� m?t tr?i b?ng 0 d?). G?i l� "h?i di?n" v� m?t trang v� m?t tr?i ? c�ng m?t hu?ng d?i v?i tr�i d?t. Chu k? c?a di?m S�c l� kho?ng 29,5 ng�y. Ng�y ch?a di?m S�c du?c g?i l� ng�y S�c, v� d� l� ng�y b?t d?u th�ng �m l?ch.
Trung kh� l� c�c di?m chia du?ng ho�ng d?o th�nh 12 ph?n b?ng nhau. Trong d�, b?n Trung kh� gi?a b?n m�a l� d?c bi?t nh?t: Xu�n ph�n (kho?ng 20/3), H? ch� (kho?ng 22/6), Thu ph�n (kho?ng 23/9) v� ��ng ch� (kho?ng 22/12).
B?i v� d?a tr�n c? m?t tr?i v� m?t trang n�n l?ch Vi?t Nam kh�ng ph?i l� thu?n �m l?ch m� l� �m-duong-l?ch. Theo c�c nguy�n t?c tr�n, d? t�nh ng�y th�ng �m l?ch cho m?t nam b?t k? tru?c h?t ch�ng ta c?n x�c d?nh nh?ng ng�y n�o trong nam ch?a c�c th?i di?m S�c (New moon) . M?t khi b?n d� t�nh du?c ng�y S�c, b?n d� bi?t du?c ng�y b?t d?u v� k?t th�c c?a m?t th�ng �m l?ch: ng�y m�ng m?t c?a th�ng �m l?ch l� ng�y ch?a di?m s�c. Sau khi d� bi?t ng�y b?t d?u/k?t th�c c�c th�ng �m l?ch, ta t�nh xem c�c Trung kh� (Major solar term) roi v�o th�ng n�o d? t? d� x�c d?nh t�n c�c th�ng v� t�m th�ng nhu?n.
��ng ch� lu�n roi v�o th�ng 11 c?a nam �m l?ch. B?i v?y ch�ng ta c?n t�nh 2 di?m s�c: S�c A ngay tru?c ng�y ��ng ch� th? nh?t v� S�c B ngay tru?c ng�y ��ng ch� th? hai. N?u kho?ng c�ch gi?a A v� B l� du?i 365 ng�y th� nam �m l?ch c� 12 th�ng, v� nh?ng th�ng d� c� t�n l�: th�ng 11, th�ng 12, th�ng 1, th�ng 2, �, th�ng 10. Ngu?c l?i, n?u kho?ng c�ch gi?a hai s�c A v� B l� tr�n 365 ng�y th� nam �m l?ch n�y l� nam nhu?n, v� ch�ng ta c?n t�m xem d�u l� th�ng nhu?n. �? l�m vi?c n�y ta xem x�t t?t c? c�c th�ng gi?a A v� B, th�ng d?u ti�n kh�ng ch?a Trung kh� sau ng�y ��ng ch� th? nh?t l� th�ng nhu?n. Th�ng d� s? du?c mang t�n c?a th�ng tru?c n� k�m ch? "nhu?n".
Khi t�nh ng�y S�c v� ng�y ch?a Trung kh� b?n c?n luu � xem x�t ch�nh x�c m�i gi?. ��y l� l� do t?i sao c� m?t v�i di?m kh�c nhau gi?a l?ch Vi?t Nam v� l?ch Trung Qu?c.V� d?, n?u b?n bi?t th?i di?m h?i di?n l� v�o l�c yyyy-02-18 16:24:45 GMT th� ng�y S�c c?a l?ch Vi?t Nam l� 18 th�ng 2, b?i v� 16:24:45 GMT l� 23:24:45 c�ng ng�y, gi? H� n?i (GMT+7, kinh tuy?n 105� d�ng). Tuy nhi�n theo gi? B?c Kinh (GMT+8, kinh tuy?n 120� d�ng) th� S�c l� l�c 00:24:45 ng�y yyyy-02-19, do d� th�ng �m l?ch c?a Trung Qu?c l?i b?t d?u ng�y yyyy-02-19, ch?m hon l?ch Vi?t Nam 1 ng�y.
V� d? 1: �m l?ch nam 1984
Ch�ng ta �p d?ng quy lu?t tr�n d? t�nh �m l?ch Vi?t nam nam 1984.
� S�c A (ngay tru?c ��ng ch� nam 1983) roi v�o ng�y 4/12/1983, S�c B (ngay tru?c ��ng ch� nam 1984) v�o ng�y 23/11/1984.
� Gi?a A v� B l� kho?ng 355 ng�y, nhu th? nam �m l?ch 1984 l� nam thu?ng. Th�ng 11 �m l?ch c?a nam tru?c k�o d�i t? 4/12/1983 d?n 2/01/1984, th�ng 12 �m t? 3/1/1984 d?n 1/2/1984, th�ng Gi�ng t? 2/2/1984 d?n 1/3/1984 v.v.
V� d? 2: �m l?ch nam 2004
� S�c A - di?m s�c cu?i c�ng tru?c ��ng ch� 2003 - roi v�o ng�y 23/11/2003. S�c B (ngay tru?c ��ng ch� nam 2004) roi v�o ng�y 12/12/2004.
� Gi?a 2 ng�y n�y l� kho?ng 385 ng�y, nhu v?y nam �m l?ch 2004 l� nam nhu?n. Th�ng 11 �m c?a nam 2003 b?t d?u v�o ng�y ch?a S�c A, t?c ng�y 23/11/2003.
� Th�ng �m l?ch d?u ti�n sau d� m� kh�ng ch?a Trung kh� l� th�ng t? 21/3/2004 d?n 18/4/2004 (Xu�n ph�n roi v�o 20/3/2004, c�n C?c vu l� 19/4/2004). Nhu th? th�ng ?y l� th�ng nhu?n.
� T? 23/11/2003 d?n 21/3/2004 l� kho?ng 120 ng�y, t?c 4 th�ng �m l?ch: th�ng 11, 12, 1 v� 2. Nhu v?y nam 2004 c� th�ng 2 nhu?n.
Thu?t to�n chuy?n d?i gi?a ng�y duong v� �m
Trong t�nh to�n thi�n van ngu?i ta l?y ng�y 1/1/4713 tru?c c�ng nguy�n c?a l?ch Julius (t?c ng�y 24/11/4714 tru?c CN theo l?ch Gregorius) l�m di?m g?c. S? ng�y t�nh t? di?m g?c n�y g?i l� s? ng�y Julius (Julian day number) c?a m?t th?i di?m. V� d?, s? ng�y Julius c?a 1/1/2000 l� 24515455.
D�ng c�c c�ng th?c sau ta c� th? chuy?n d?i gi?a ng�y/th�ng/nam v� s? ng�y Julius. Ph�p chia ? 2 c�ng th?c sau du?c hi?u l� chia s? nguy�n, b? ph?n du: 23/4=5.
�?i ng�y dd/mm/yyyy ra s? ng�y Julius jd
a = (14 - mm) / 12
y = yy+4800-a
m = mm+12*a-3

L?ch Gregory:

jd = dd + (153*m+2)/5 + 365*y + y/4 - y/100 + y/400 - 32045

L?ch Julius:

jd = dd + (153*m+2)/5 + 365*y + y/4 - 32083
�?i s? ng�y Julius jd ra ng�y dd/mm/yyyy
L?ch Gregory (jd l?n hon 2299160):

a = jd + 32044;
b = (4*a+3)/146097;
c = a - (b*146097)/4;

L?ch Julius:

b = 0;
c = jd + 32082;

C�ng th?c cho c? 2 lo?i l?ch:

d = (4*c+3)/1461;
e = c - (1461*d)/4;
m = (5*e+2)/153;
dd = e - (153*m+2)/5 + 1;
mm = m + 3 - 12*(m/10);
yy = b*100 + d - 4800 + m/10;
N?u ng�n ng? l?p tr�nh b?n d�ng kh�ng h? tr? ph�p chia s? nguy�n b? ph?n du (VD: JavaScript), b?n c� th? d?nh nghia m?t h�m INT(x) d? l?y s? nguy�n l?n nh?t kh�ng vu?t qu� x: INT(5)=5, INT(3.2)=3, INT(-5)=-5, INT(-3.2)=-4 v.v. Khi d�, INT(m/10) s? tr? l?i k?t qu? c?a ph�p chia s? nguy�n. (Nhi?u ng�n ng? c� s?n h�m floor() cho ph�p l�m vi?c n�y.)
C�c ph�p chuy?n d?i gi?a ng�y th�ng v� s? ng�y Julius c� th? du?c th?c hi?n v?i m� JavaScript nhu sau:
function jdFromDate(dd, mm, yy)
var a, y, m, jd;
a = INT((14 - mm) / 12);
y = yy+4800-a;
m = mm+12*a-3;
jd = dd + INT((153*m+2)/5) + 365*y + INT(y/4) - INT(y/100) + INT(y/400) - 32045;
if (jd < 2299161) {
jd = dd + INT((153*m+2)/5) + 365*y + INT(y/4) - 32083;
}
return jd;
function jdToDate(jd)
var a, b, c, d, e, m, day, month, year;
if (jd > 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);
return new Array(day, month, year);
 
T�nh ng�y S�c
Nhu tr�n d� n�i, d? t�nh du?c �m l?ch tru?c h?t ta c?n x�c d?nh c�c th�ng �m l?ch b?t d?u v�o ng�y n�o.
Thu?t to�n sau t�nh ng�y S�c th? k k? t? di?m S�c ng�y 1/1/1900. K?t qu? tr? v? l� s? ng�y Julius c?a ng�y S�c c?n t�m.
function getNewMoonDay(k, timeZone)
var T, T2, T3, dr, Jd1, M, Mpr, F, C1, deltat, JdNew;
T = k/1236.85; // Time in Julian centuries from 1900 January 0.5
T2 = T * T;
T3 = T2 * T;
dr = PI/180;
Jd1 = 2415020.75933 + 29.53058868*k + 0.0001178*T2 - 0.000000155*T3;
Jd1 = Jd1 + 0.00033*Math.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)*Math.sin(M*dr) + 0.0021*Math.sin(2*dr*M);
C1 = C1 - 0.4068*Math.sin(Mpr*dr) + 0.0161*Math.sin(dr*2*Mpr);
C1 = C1 - 0.0004*Math.sin(dr*3*Mpr);
C1 = C1 + 0.0104*Math.sin(dr*2*F) - 0.0051*Math.sin(dr*(M+Mpr));
C1 = C1 - 0.0074*Math.sin(dr*(M-Mpr)) + 0.0004*Math.sin(dr*(2*F+M));
C1 = C1 - 0.0004*Math.sin(dr*(2*F-M)) - 0.0006*Math.sin(dr*(2*F+Mpr));
C1 = C1 + 0.0010*Math.sin(dr*(2*F-Mpr)) + 0.0005*Math.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;
return INT(JdNew + 0.5 + timeZone/24)
V?i h�m n�y ta c� th? t�nh du?c th�ng �m l?ch ch?a ng�y N b?t d?u v�o ng�y n�o: gi?a ng�y 1/1/1900 (s? ng�y Julius: 2415021) v� ng�y N c� kho?ng k=INT((N-2415021)/29.530588853) th�ng �m l?ch, nhu th? d�ng h�m getNewMoonDay s? bi?t ng�y d?u th�ng �m l?ch ch?a ng�y N, t? d� ta bi?t ng�y N l� m�ng m?y �m l?ch.
T�nh t?a d? m?t tr?i
�? bi?t Trung kh� n�o n?m trong th�ng �m l?ch n�o, ta ch? c?n t�nh xem m?t tr?i n?m ? kho?ng n�o tr�n du?ng ho�ng d?o v�o th?i di?m b?t d?u m?t th�ng �m l?ch. Ta chia du?ng ho�ng d?o l�m 12 ph?n v� d�nh s? c�c cung n�y t? 0 d?n 11: t? Xu�n ph�n d?n C?c vu l� 0; t? C?c vu d?n Ti?u m�n l� 1; t? Ti?u m�n d?n H? ch� l� 2; v.v.. Cho jdn l� s? ng�y Julius c?a b?t k? m?t ng�y, phuong ph�p sau n�y s? tr? l?i s? cung n�i tr�n.
function getSunLongitude(jdn, timeZone)
var T, T2, dr, M, L0, DL, L;
T = (jdn - 2451545.5 - timeZone/24) / 36525; // Time in Julian centuries from 2000-01-01 12:00:00 GMT
T2 = T*T;
dr = 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)*Math.sin(dr*M);
DL = DL + (0.019993 - 0.000101*T)*Math.sin(dr*2*M) + 0.000290*Math.sin(dr*3*M);
L = L0 + DL; // true longitude, degree
L = L*dr;
L = L - PI*2*(INT(L/(PI*2))); // Normalize to (0, 2*PI)
return INT(L / PI * 6)
V?i h�m n�y ta bi?t du?c m?t th�ng �m l?ch ch?a Trung kh� n�o. Gi? s? m?t th�ng �m l?ch b?t d?u v�o ng�y N1 v� th�ng sau d� b?t d?u v�o ng�y N2 v� h�m getSunLongitude cho k?t qu? l� 8 v?i N1 v� 9 v?i N2. Nhu v?y th�ng �m l?ch b?t d?u ng�y N1 l� th�ng ch?a ��ng ch�: trong kho?ng t? N1 d?n N2 c� m?t ng�y m?t tr?i di chuy?n t? cung 8 (sau Ti?u tuy?t) sang cung 9 (sau ��ng ch�). N?u h�m getSunLongitude tr? l?i c�ng m?t k?t qu? cho c? ng�y b?t d?u m?t th�ng �m l?ch v� ng�y b?t d?u th�ng sau d� th� th�ng d� kh�ng c� Trung kh� v� nhu v?y c� th? l� th�ng nhu?n.
T�m ng�y b?t d?u th�ng 11 �m l?ch
��ng ch� thu?ng n?m v�o kho?ng 19/12-22/12, nhu v?y tru?c h?t ta t�m ng�y S�c tru?c ng�y 31/12. N?u th�ng b?t d?u v�o ng�y d� kh�ng ch?a ��ng ch� th� ta ph?i l�i l?i 1 th�ng n?a.
function getLunarMonth11(yy, timeZone)
var k, off, nm, sunLong;
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;
X�c d?nh th�ng nhu?n
N?u gi?a hai th�ng 11 �m l?ch (t?c th�ng c� ch?a ��ng ch�) c� 13 th�ng �m l?ch th� nam �m l?ch d� c� th�ng nhu?n. �? x�c d?nh th�ng nhu?n, ta s? d?ng h�m getSunLongitude nhu d� n�i ? tr�n. Cho a11 l� ng�y b?t d?u th�ng 11 �m l?ch m� m?t trong 13 th�ng sau d� l� th�ng nhu?n. H�m sau cho bi?t th�ng nhu?n n?m ? v? tr� n�o sau th�ng 11 n�y.
function getLeapMonthOffset(a11, timeZone)
var k, last, arc, i;
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++;
arc = getSunLongitude(getNewMoonDay(k+i, timeZone), timeZone);
} while (arc != last && i < 14);
return i-1;

Gi? s? h�m getLeapMonthOffset tr? l?i gi� tr? 4, nhu th? th�ng nhu?n s? l� th�ng sau th�ng 2 thu?ng. (Th�ng th? 4 sau th�ng 11 d�ng ra l� th�ng 3, nhung v� d� l� th�ng nhu?n n�n s? l?y t�n c?a th�ng tru?c d� t?c th�ng 2, v� th�ng th? 5 sau th�ng 11 m?i l� th�ng 3).
�?i ng�y duong dd/mm/yyyy ra ng�y �m
V?i c�c phuong ph�p h? tr? tr�n ta c� th? d?i ng�y duong dd/mm/yy ra ng�y �m d? d�ng. Tru?c h?t ta xem ng�y monthStart b?t d?u th�ng �m l?ch ch?a ng�y n�y l� ng�y n�o (d�ng h�m getNewMoonDay nhu tr�n d� n�i). Sau d�, ta t�m c�c ng�y a11 v� b11 l� ng�y b?t d?u c�c th�ng 11 �m l?ch tru?c v� sau ng�y dang xem x�t. N?u hai ng�y n�y c�ch nhau du?i 365 ng�y th� ta ch? c�n c?n xem monthStart v� a11 c�ch nhau bao nhi�u th�ng l� c� th? t�nh du?c dd/mm/yy n?m trong th�ng m?y �m l?ch. Ngu?c l?i, n?u a11 v� b11 c�ch nhau kho?ng 13 th�ng �m l?ch th� ta ph?i t�m xem th�ng n�o l� th�ng nhu?n v� t? d� suy ra ng�y dang t�m n?m trong th�ng n�o.
function convertSolar2Lunar(dd, mm, yy, timeZone)
var k, dayNumber, monthStart, a11, b11, lunarDay, lunarMonth, lunarYear, lunarLeap;
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;
}

�?i �m l?ch ra duong l?ch
C�ch l�m cung tuong t? nhu d?i ng�y duong sang ng�y �m.
function convertLunar2Solar(lunarDay, lunarMonth, lunarYear, lunarLeap, timeZone)
var k, a11, b11, off, leapOff, leapMonth, monthStart;
if (lunarMonth < 11) {
a11 = getLunarMonth11(lunarYear-1, timeZone);
b11 = getLunarMonth11(lunarYear, timeZone);
} else {
a11 = getLunarMonth11(lunarYear, timeZone);
b11 = getLunarMonth11(lunarYear+1, timeZone);
}
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 new Array(0, 0, 0);
} else if (lunarLeap != 0 || off >= leapOff) {
off += 1;
}
}
k = INT(0.5 + (a11 - 2415021.076998695) / 29.530588853);
monthStart = getNewMoonDay(k+off, timeZone);
return jdToDate(monthStart+lunarDay-1);
T�nh ng�y th? v� Can-Chi cho ng�y v� th�ng �m l?ch
Ng�y th? l?p l?i theo chu k? 7 ng�y, nhu th? d? bi?t m?t ng�y d/m/y b?t k? l� th? m?y ta ch? vi?c t�m s? du c?a s? ng�y Julius c?a ng�y n�y cho 7.
�? t�nh Can c?a nam Y, t�m s? du c?a Y+6 chia cho 10. S? du 0 l� Gi�p, 1 l� ?t v.v. �? t�nh Chi c?a nam, chia Y+8 cho 12. S? du 0 l� T�, 1 l� S?u, 2 l� D?n v.v.
Hi?u Can-Chi c?a ng�y l?p l?i theo chu k? 60 ng�y, nhu th? n� cung c� th? t�nh du?c m?t c�ch don gi?n. Cho N l� s? ng�y Julius c?a ng�y dd/mm/yyyy. Ta chia N+9 cho 10. S? du 0 l� Gi�p, 1 l� ?t v.v. �? t�m Chi, chia N+1 cho 12; s? du 0 l� T�, 1 l� S?u v.v.
Trong m?t nam �m l?ch, th�ng 11 l� th�ng T�, th�ng 12 l� S?u, th�ng Gi�ng l� th�ng D?n v.v. Can c?a th�ng M nam Y �m l?ch du?c t�nh theo c�ng th?c sau: chia Y*12+M+3 cho 10. S? du 0 l� Gi�p, 1 l� ?t v.v.
V� d?, Can-Chi c?a th�ng 3 �m l?ch nam Gi�p Th�n 2004 l� M?u Th�n: th�ng 3 �m l?ch l� th�ng Th�n, v� (2004*12+3+3) % 10 = 24054 % 10 = 4, nhu v?y Can c?a th�ng l� M?u.
M?t th�ng nhu?n kh�ng c� t�n ri�ng m� l?y t�n c?a th�ng tru?c d� k�m th�m ch? "Nhu?n", VD: th�ng 2 nhu?n nam Gi�p Th�n 2004 l� th�ng �inh M�o nhu?n.

Back to Top
Sponsored Links


Back to Top
administrator View Drop Down
Admin
Admin

ad

Joined: 14 October 2005
Status: Offline
Points: 512
Post Options Post Options   Thanks (0) Thanks(0)   Quote administrator Quote  Post ReplyReply Direct Link To This Post Posted: 11 June 2009 at 09:44

using System;
using System.Collections.Generic;
using System.Text;

namespace LichCongTac.Modules
{
     public class ChuyenDoiNgay
     {
         private double timeZone = 7.0;
         //L?y Ng�y Julius
         public long getJulius(int intNgay, int intThang, int intNam)
         {
             int a, y, m, jd;
             a = (int)((14 - intThang) / 12);
             y = intNam + 4800 - a;
             m = intThang + 12 * a - 3;
             jd = intNgay + (int)((153 * m + 2) / 5) + 365 * y + (int)(y / 4) - (int)(y / 100) + (int)(y / 400) - 32045;
             if (jd < 2299161)
             {
                 jd = intNgay + (int)((153 * m + 2) / 5) + 365 * y + (int)(y / 4) - 32083;
             }
             return jd;
         }

         // T? ng�y Julius chuy?n ra ng�y thu?ng
         public string jdToDate(int jd)
         {
             int a, b, c, d, e, m;
             int day, month, year;
             if (jd > 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);
             return day.ToString() + "/" + month.ToString() + "/" + year.ToString();
         }

         //T�nh ng�y S�c
         public int getNewMoonDay(int k)
         {
             double T, T2, T3, dr, Jd1, M, Mpr, F, C1, deltat, JdNew;
             T = k / 1236.85;
             T2 = T * T;
             T3 = T2 * T;
             dr = Math.PI / 180;
             Jd1 = 2415020.75933 + 29.53058868 * k + 0.0001178 * T2 - 0.000000155 * T3;
             Jd1 = Jd1 + 0.00033 * Math.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) * Math.Sin(M * dr) + 0.0021 * Math.Sin(2 * dr * M);
             C1 = C1 - 0.4068 * Math.Sin(Mpr * dr) + 0.0161 * Math.Sin(dr * 2 * Mpr);
             C1 = C1 - 0.0004 * Math.Sin(dr * 3 * Mpr);
             C1 = C1 + 0.0104 * Math.Sin(dr * 2 * F) - 0.0051 * Math.Sin(dr * (M + Mpr));
             C1 = C1 - 0.0074 * Math.Sin(dr * (M - Mpr)) + 0.0004 * Math.Sin(dr * (2 * F + M));
             C1 = C1 - 0.0004 * Math.Sin(dr * (2 * F - M)) - 0.0006 * Math.Sin(dr * (2 * F + Mpr));
             C1 = C1 + 0.0010 * Math.Sin(dr * (2 * F - Mpr)) + 0.0005 * Math.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;
             return (int)(JdNew + 0.5 + timeZone / 24);
         }

         //T�nh to? d? m?t tr?i
         public int getSunLongitude(int jdn)
         {
             double T, T2, dr, M, L0, DL, L;
             T = (jdn - 2451545.5 - timeZone / 24) / 36525; // Time in Julian centuries from 2000-01-01 12:00:00 GMT
             T2 = T * T;
             dr = Math.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) * Math.Sin(dr * M);
             DL = DL + (0.019993 - 0.000101 * T) * Math.Sin(dr * 2 * M) + 0.000290 * Math.Sin(dr * 3 * M);
             L = L0 + DL; // true longitude, degree
             L = L * dr;
             L = L - Math.PI * 2 * (int)(L / (Math.PI * 2)); // Normalize to (0, 2*PI)
             return (int)(L / Math.PI * 6);
         }

         //T�m ng�y b?t d?u th�ng 11 �m l?ch
         public int getLunarMonthll(int intNam)
         {
             double k, off, nm, sunLong;
             off = getJulius(31, 12, intNam) - 2415021;
             k = (int)(off / 29.530588853);
             nm = getNewMoonDay((int)k);
             sunLong = getSunLongitude((int)nm); // sun longitude at local midnight
             if (sunLong >= 9)
             {
                 nm = getNewMoonDay((int)k - 1);
             }
             return (int)nm;
         }

         //X�c d?nh th�ng nhu?n
         public int getLeapMonthOffset(double a11)
         {
             double last, arc;
             int k, i;
             k = (int)((a11 - 2415021.076998695) / 29.530588853 + 0.5);
             last = 0;
             i = 1; // We start with the month following lunar month 11
             arc = getSunLongitude((int)getNewMoonDay((int)(k + i)));
             do
             {
                 last = arc;
                 i++;
                 arc = getSunLongitude((int)getNewMoonDay((int)(k + i)));
             } while (arc != last && i < 14);
             return i - 1;
         }

         //�?i ng�y duong ra ng�y �m
         public string convertSolar2Lunar(int intNgay, int intThang, int intNam)
         {
             double dayNumber, monthStart, a11, b11, lunarDay, lunarMonth, lunarYear;
             //double lunarLeap;
             int k, diff;
             dayNumber = getJulius(intNgay,intThang,intNam);
             k = (int)((dayNumber - 2415021.076998695) / 29.530588853);
             monthStart = getNewMoonDay(k + 1);
             if (monthStart > dayNumber)
             {
                 monthStart = getNewMoonDay(k);
             }
             a11 = getLunarMonthll(intNam);
             b11 = a11;
             if (a11 >= monthStart)
             {
                 lunarYear = intNam;
                 a11 = getLunarMonthll(intNam - 1);
             }
             else
             {
                 lunarYear = intNam + 1;
                 b11 = getLunarMonthll(intNam + 1);
             }
             lunarDay = dayNumber - monthStart + 1;
             diff = (int)((monthStart - a11) / 29);
             //lunarLeap = 0;
             lunarMonth = diff + 11;
             if (b11 - a11 > 365)
             {
                 int leapMonthDiff = getLeapMonthOffset(a11);
                 if (diff >= leapMonthDiff)
                 {
                     lunarMonth = diff + 10;
                     if (diff == leapMonthDiff)
                     {
                         //lunarLeap = 1;
                     }
                 }
             }
             if (lunarMonth > 12)
             {
                 lunarMonth = lunarMonth - 12;
             }
             if (lunarMonth >= 11 && diff < 4)
             {
                 lunarYear -= 1;
             }
             string strNgay = lunarDay.ToString();
             string strThang = lunarMonth.ToString();
             string strNam = lunarYear.ToString();
             return strNgay + "/" + strThang;
         }
     }
}

Back to Top
 Post Reply Post Reply
  Share Topic   

Forum Jump Forum Permissions View Drop Down

Forum Software by Web Wiz Forums® version 12.03
Copyright ©2001-2019 Web Wiz Ltd.

This page was generated in 0.063 seconds.
bao ky nam , Thuoc nam ky dieu
chu ky so