DS ko làm được.
Muốn tính lịch âm dương thì cần sử dụng thuật toán để chuyển.
Code:
Private Can(10), Chi(12)
Function jdFromDate(dd, mm, yy)
Dim 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) Then
jd = dd + Int((153 * M + 2) / 5) + 365 * y + Int(y / 4) - 32083
End If
jdFromDate = jd
End Function
Function getNewMoonDay(k, timeZone)
Dim 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.001 * Math.Sin(dr * (2 * F - Mpr)) + 0.0005 * Math.Sin(dr * (2 * Mpr + M))
If (T < -11) Then
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
End If
JdNew = Jd1 + C1 - deltat
getNewMoonDay = Int(JdNew + 0.5 + timeZone / 24)
End Function
Function getSunLongitude(jdn, timeZone)
Dim T, T2, dr, M, L0, DL, L
PI = 3.14
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.5291 + 35999.0503 * 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.9146 - 0.004817 * T - 0.000014 * T2) * Math.Sin(dr * M)
DL = DL + (0.019993 - 0.000101 * T) * Math.Sin(dr * 2 * M) + 0.00029 * 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)
getSunLongitude = Int(L / PI * 6)
End Function
Function getLunarMonth11(yy, timeZone)
Dim 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) Then
nm = getNewMoonDay(k - 1, timeZone)
End If
getLunarMonth11 = nm
End Function
Function getLeapMonthOffset(a11, timeZone)
Dim k, Last, arc, i
k = Int((a11 - 2415021.07699869) / 29.530588853 + 0.5)
Last = 0
i = 1 ' We start with the month following lunar month 11
arc = getSunLongitude(getNewMoonDay(k + i, timeZone), timeZone)
While (arc <> Last And i < 14)
Last = arc
i = i + 1
arc = getSunLongitude(getNewMoonDay(k + i, timeZone), timeZone)
Wend
getLeapMonthOffset = i - 1
End Function
Function convertSolar2Lunar(dd, mm, yy, timeZone)
Dim k, dayNumber, monthStart, a11, b11, lunarDay, lunarMonth, lunarYear, lunarLeap
dayNumber = jdFromDate(dd, mm, yy)
k = Int((dayNumber - 2415021.07699869) / 29.530588853)
monthStart = getNewMoonDay(k + 1, timeZone)
If (monthStart > dayNumber) Then
monthStart = getNewMoonDay(k, timeZone)
End If
a11 = getLunarMonth11(yy, timeZone)
b11 = a11
If (a11 >= monthStart) Then
lunarYear = yy
a11 = getLunarMonth11(yy - 1, timeZone)
Else
lunarYear = yy + 1
b11 = getLunarMonth11(yy + 1, timeZone)
End If
lunarDay = dayNumber - monthStart + 1
diff = Int((monthStart - a11) / 29)
lunarLeap = 0
lunarMonth = diff + 11
If (b11 - a11 > 365) Then
leapMonthDiff = getLeapMonthOffset(a11, timeZone)
If (diff >= leapMonthDiff) Then
lunarMonth = diff + 10
If (diff = leapMonthDiff) Then
lunarLeap = 1
End If
End If
End If
If (lunarMonth > 12) Then
lunarMonth = lunarMonth - 12
End If
If (lunarMonth >= 11 And diff < 4) Then
lunarYear = lunarYear - 1
End If
Text1.Text = lunarDay & "/" & lunarMonth & "/" & lunarYear
End Function
Private Sub Form_Load()
Can(1) = "Giap"
Can(2) = "At"
Can(3) = "Binh"
Can(4) = "Dinh"
Can(5) = "Mau"
Can(6) = "Ky"
Can(7) = "Canh"
Can(8) = "Tan"
Can(9) = "Nham"
Can(10) = "Quy"
Chi(1) = "Ty"
Chi(2) = "Suu"
Chi(3) = "Dan"
Chi(4) = "Mao"
Chi(5) = "Thin"
Chi(6) = "Ty"
Chi(7) = "Ngo"
Chi(8) = "Mui"
Chi(9) = "Than"
Chi(10) = "Dau"
Chi(11) = "Tuat"
Chi(12) = "Hoi"
timeZone = 7
convertSolar2Lunar 19, 5, 2007, 7
Me.Caption = Can((2007 + 6) Mod 10) & " " & Chi((2007 + 8) Mod 12)
End Sub