PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > PIC - Thiết kế và Ứng dụng

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

PIC - Thiết kế và Ứng dụng Ý tưởng cho các sản phẩm sử dụng PIC/dsPIC và các sản phẩm của Microchip

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 27-05-2007, 01:25 PM   #1
zero
Đệ tử 4 túi
 
Tham gia ngày: Feb 2007
Bài gửi: 87
:
Send a message via Yahoo to zero
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.
Đây là thuật toán dùng VB để đổi
Các bạn nghiên cứu thử nhé!

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
__________________
Today Not Tomorow ....
YM: hoangcuong2k <= Ai rảnh thì chat nhé
zero vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 03:38 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam