module xem giờ, ngày,tháng, năm âm lịch

Các thủ thuật liên quan đến xử lý chuỗi và thời gian
Post Reply
TrungDung1977
Thành viên chính thức
Thành viên chính thức
Posts: 44
Joined: Tue 15/08/2006 11:19 pm
Location: TPHCM

module xem giờ, ngày,tháng, năm âm lịch

Post by TrungDung1977 »

Thủ thuật: thời gian
Tác giả: sưu tầm (không nhớ là down của ai bên DĐ cũ)
Mô tả: chuyển ngày dương lịch sang giờ, ngày, tháng, năm Âm lịch. Phù hợp với ai muốn làm lịch

Code: Select all

Private Type solardate    solarday As Integer    solarmonth As Integer    solaryear As IntegerEnd TypePrivate Type solarlunar    sdate As solardate    evallunar As Integer    leapmoon As Integer 'chi co hai gia tri la 0 hoac 1End TypePrivate Type lunardate    lunarday As Integer    lunarmonth As Integer    lunaryear As Integer    leapmoon As Integer 'chi co hai gia tri la 0 hoac 1End Type Const PI = 3.14159265358979 + 3.238462643383E-15 + 2.795E-28 Private Function UniversalToJD(ByVal solarday As Integer, ByVal solarmonth As Integer, ByVal solaryear As Integer) As Double'tra ve 1  ngay julius cua ngay duong lich    Dim jd As Double        If (solaryear > 1582 Or (solaryear = 1582 And solarmonth > 10) Or (solaryear = 1582 And solarmonth = 10 And solarday > 14)) Then            jd = 367            jd = jd * solaryear            jd = jd - Int(7 * (solaryear + Int((solarmonth + 9) / 12)) / 4)            jd = jd - Int(3 * (Int((solaryear + (solarmonth - 9) / 7) / 100) + 1) / 4)            jd = jd + Int(275 * solarmonth / 9)            jd = jd + solarday            jd = jd + 1721028.5        Else            jd = 367            jd = jd * solaryear            jd = jd - Int(7 * (solaryear + 5001 + Int((solarmonth - 9) / 7)) / 4)            jd = jd + Int(275 * solarmonth / 9)            jd = jd + solarday            jd = jd + 1729776.5        End If        UniversalToJD = jdEnd Function  Private Function solar2lunar(ByVal solarday As Integer, ByVal solarmonth As Integer, ByVal solaryear As Integer, ByVal local_timezone As Byte) As lunardate    Dim ly() As solarlunar    Dim jdToday, jdMonth11 As Double    Dim month11 As solardate    Dim i, dd, mm, yy As Integer        yy = solaryear        lunaryear solaryear, ly(), local_timezone        month11 = ly(UBound(ly)).sdate        jdToday = LocalToJD(solarday, solarmonth, solaryear, local_timezone)        jdMonth11 = LocalToJD(month11.solarday, month11.solarmonth, month11.solaryear, local_timezone)        If (jdToday >= jdMonth11) Then            lunaryear solaryear + 1, ly(), local_timezone            yy = solaryear + 1        End If        i = UBound(ly)        Do While (jdToday < LocalToJD(ly(i).sdate.solarday, ly(i).sdate.solarmonth, ly(i).sdate.solaryear, local_timezone))                i = i - 1        Loop        dd = Int(jdToday - LocalToJD(ly(i).sdate.solarday, ly(i).sdate.solarmonth, ly(i).sdate.solaryear, local_timezone)) + 1        mm = ly(i).evallunar        If (mm >= 11) Then                yy = yy - 1        End If        With solar2lunar            .leapmoon = ly(i).leapmoon            .lunarday = dd            .lunarmonth = mm            .lunaryear = yy        End WithEnd Function Private Sub lunaryear(ByVal solaryear As Integer, ret() As solarlunar, ByVal local_timezone As Byte)    Dim jdmonth11A, off As Double    Dim k, i, foundI, j As Integer    Dim sunlongitudes(1 To 14) As Double    Dim foundB, hasMajorTerm, p1, p2, leap As Boolean    Dim sl1, sl2, sl3, sl4, kl As Double    Dim SUNLONG_MAJOR(1 To 12) As Double        jdmonth11A = LocalToJD(LunarMonth11(solaryear - 1, local_timezone).solarday, LunarMonth11(solaryear - 1, local_timezone).solarmonth, LunarMonth11(solaryear - 1, local_timezone).solaryear, local_timezone)        k = Int(0.5 + (jdmonth11A - 2415021.07699869 - 0.000000005) / 29.530588853)        'k la ngay soc cua mong 1 thang 11 nam solaryear -1        off = LocalToJD(LunarMonth11(solaryear, local_timezone).solarday, LunarMonth11(solaryear, local_timezone).solarmonth, LunarMonth11(solaryear, local_timezone).solaryear, local_timezone) - jdmonth11A        leap = off > 365        If leap Then            ReDim Preserve ret(1 To 14)            'neu la nam nhuan thi tu thang 11 nam nay den thang 11nam sua se co 14 ngay soc tat ca        Else            ReDim Preserve ret(1 To 13)            'neu khong nhuan thi se co 13 ngay soc  tat ca        End If        For i = 1 To UBound(ret)            With ret(i)                .sdate = LocalFromJD(NewMoon(k + i - 1), local_timezone)                .evallunar = MOD1(i + 10, 12)                .leapmoon = 0            End With        Next        If (leap) Then        'den day thi chac chan nam nay se la nam nhuan        'nen so ngay soc se la 14 ngay trong nam            For i = 0 To 11                SUNLONG_MAJOR(i + 1) = i * PI / 6            Next            'tao ra 12 tiet khi tu (0 den 11)*pi/6            For i = 1 To 14                kl = LocalToJD(ret(i).sdate.solarday, ret(i).sdate.solarmonth, ret(i).sdate.solaryear, local_timezone)                sunlongitudes(i) = SunLongitude(kl)            Next            'tinh ra trung khi cua nhung thang am lich            foundB = False            For i = 1 To 13                sl1 = sunlongitudes(i)                sl2 = sunlongitudes(i + 1)                'trung khi cua hai thang lien tiep                hasMajorTerm = False                For j = 1 To 11                    sl3 = SUNLONG_MAJOR(j)                    sl4 = SUNLONG_MAJOR(j + 1)                    p1 = ((sl3 < sl1) And (sl1 < sl2) And (sl2 < sl4))                    p2 = ((sl3 < sl2) And (sl2 < sl1) And (sl1 < sl4))                    If (p1 Or p2) Then                        hasMajorTerm = True                    End If                    If hasMajorTerm Then                        ret(i).leapmoon = 1                        ret(i).evallunar = MOD1(i + 9, 12)                        foundB = True                        foundI = i                        Exit For                    End If                Next                If foundB Then                    Exit For                End If            Next            For i = foundI + 1 To 14                ret(i).evallunar = MOD1(i + 9, 12)            Next        End IfEnd Sub Private Function LocalFromJD(ByVal jd As Double, ByVal local_timezone As Byte) As solardate'tra ve ngay ,thang ,nam  cua nam duong lich cho 1 ngay julius tuong ung voi mui gio         LocalFromJD = UniversalFromJD(jd + local_timezone / 24)End Function Private Function LocalToJD(ByVal solarday As Integer, ByVal solarmonth As Integer, ByVal solaryear As Integer, ByVal local_timezone As Byte) As Double'tra ve 1  ngay julius cua ngay duong lich voi mui gio        LocalToJD = UniversalToJD(solarday, solarmonth, solaryear) - local_timezone / 24End Function Private Function LunarMonth11(ByVal solaryear As Integer, ByVal local_timezone As Byte) As solardate'tính thang am lich chua Ðong chi'tra ve ngay mong 1 thang 11 am cua  nam solaryear    Dim off, jd, sunLong As Double    Dim k As Integer    Dim ret As solardate        off = LocalToJD(31, 12, solaryear, local_timezone) - 2415021.07699869 - 0.000000005        k = Int(off / 29.530588853)        jd = NewMoon(k)        ret = LocalFromJD(jd, local_timezone)        sunLong = SunLongitude(LocalToJD(ret.solarday, ret.solarmonth, ret.solaryear, local_timezone))        If (sunLong > 3 * PI / 2) Then            jd = NewMoon(k - 1)        End If    LunarMonth11 = LocalFromJD(jd, local_timezone)End Function Private Function NewMoon(ByVal k As Integer) As Double'tra ve gia tri cua ngay julius tuong ung voi ngay soc thu k    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    NewMoon = JdNewEnd Function Private Function MOD1(ByVal x As Long, ByVal y As Long) As Long'tra ve gia tri cua so du  khi x chia cho y    Dim Z        Z = x - (y * Int(x / y))        If Z = 0 Then            Z = y        End If        MOD1 = ZEnd Function Private Function SunLongitude(ByVal jdn As Double) As Double'tra ve trung khi cua thang    Dim T, T2, dr, M, L0, DL, l        T = (jdn - 2451545) / 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)    SunLongitude = lEnd Function  Private Function UniversalFromJD(ByVal jd As Double) As solardate'tra ve ngay ,thang ,nam  cua nam duong lich cho 1 ngay julius tuong ung        Dim Z, A, alpha, B, C, D, E, dd, mm, yyyy        Dim f As Double        Z = Int(jd + 0.5)        f = (jd + 0.5) - Z        If (Z < 2299161) Then            A = Z        Else            alpha = Int((Z - 1867216.25) / 36524.25)            A = Z + 1 + alpha - Int(alpha / 4)        End If        B = A + 1524        C = Int((B - 122.1) / 365.25)        D = Int(365.25 * C)        E = Int((B - D) / 30.6001)        dd = Int(B - D - Int(30.6001 * E) + f)        If (E < 14) Then            mm = E - 1        Else            mm = E - 13        End If        If (mm < 3) Then            yyyy = C - 4715        Else            yyyy = C - 4716        End If        With UniversalFromJD            .solarday = dd            .solarmonth = mm            .solaryear = yyyy        End WithEnd Function  Public Function LayThoiGianAL(ByVal solarday As Integer, ByVal solarmonth As Integer, ByVal solaryear As Integer, ByVal local_timezone As Byte) As String    Dim Esteam(9) As String    Dim Ebranch(11) As String    Dim Vsteam(9) As String    Dim Vbranch(11) As String    Dim ld, lm, ly, llm As Integer    Dim str$        'khai bao thien can tieng anh        Esteam(0) = "Jia":        Esteam(1) = "Yi":        Esteam(2) = "Bing":        Esteam(3) = "Ding"        Esteam(4) = "Wu":        Esteam(5) = "Ji":        Esteam(6) = "Geng":        Esteam(7) = "Xin"        Esteam(8) = "Ren":        Esteam(9) = "Gui"        'khai bao thien can tieng viet        Vsteam(0) = "Gia1p":        Vsteam(1) = "A61t":        Vsteam(2) = "Bi1nh":        Vsteam(3) = "D9inh"        Vsteam(4) = "Ma65u":        Vsteam(5) = "Ky3":        Vsteam(6) = "Canh":        Vsteam(7) = "Ta6n"        Vsteam(8) = "Nha6m":        Vsteam(9) = "Quy1"        'khai bao dia chi tieng anh        Ebranch(0) = "zi":        Ebranch(1) = "chou":        Ebranch(2) = "Yin":        Ebranch(3) = "Mao"        Ebranch(4) = "Chen":        Ebranch(5) = "Si":        Ebranch(6) = "wu":        Ebranch(7) = "Wei"        Ebranch(8) = "Shen":        Ebranch(9) = "You":        Ebranch(10) = "Xu":        Ebranch(11) = "Hai"        'khai bao dia chi tieng viet        Vbranch(0) = "Ty1":        Vbranch(1) = "Su73u":        Vbranch(2) = "Da62n":        Vbranch(3) = "Ma4o"        Vbranch(4) = "Thi2n":        Vbranch(5) = "Ty5":        Vbranch(6) = "Ngo5":        Vbranch(7) = "Mu2i"        Vbranch(8) = "Tha6n":        Vbranch(9) = "Da65u":        Vbranch(10) = "Tua61t":        Vbranch(11) = "Ho75i"                With solar2lunar(solarday, solarmonth, solaryear, local_timezone)            ld = .lunarday            lm = .lunarmonth            ly = .lunaryear            llm = .leapmoon        End With                'tao ngay can chi        str = Vsteam(Int(UniversalToJD(solarday, solarmonth, solaryear) + 9.5) Mod 10)'        AALdaySBsteam.Caption = Esteam(Int(UniversalToJD(solarday, solarmonth, solaryear) + 9.5) Mod 10)        str = str & " " & Vbranch(Int(UniversalToJD(solarday, solarmonth, solaryear) + 1.5) Mod 12)'        AALdaySBbranch.Caption = Ebranch(Int(UniversalToJD(solarday, solarmonth, solaryear) + 1.5) Mod 12)        str = str & "//" '        'tao thang can chi        str = str & Vsteam((ly * 12 + lm + 3) Mod 10)        '        AALmoonSBsteam.Caption = Esteam((ly * 12 + lm + 3) Mod 10)'        AALmoonSBbranch.Caption = Ebranch((lm + 1) Mod 12)        str = str & " " & Vbranch((lm + 1) Mod 12)                str = str & "//" '        If llm Then'            Vleapmonth.Caption = "(N)"'            Eleapmonth.Caption = "(L)"'        Else'            Vleapmonth.Caption = ""'            Eleapmonth.Caption = ""'        End If                        'tao nam can chi        str = str & Vsteam((ly + 6) Mod 10)'        AALyearSBsteam.Caption = Esteam((ly + 6) Mod 10)        str = str & " " & Vbranch((ly + 8) Mod 12)'        AALyearSBbranch.Caption = Ebranch((ly + 8) Mod 12)                str = str & "//"        'tao gio can chi        str = str & Vsteam(((Int(UniversalToJD(solarday, solarmonth, solaryear) + 9.5) Mod 10) Mod 5) * 2)'        AALhoursteam.Caption = Esteam(((Int(UniversalToJD(solarday, solarmonth, solaryear) + 9.5) Mod 10) Mod 5) * 2)                        LayThoiGianAL = str & " Ty1//" & ld & "/" & lm & "/" & ly & "//" & llm End Function
Cách sử dụng:
LayThoiGianAL(12,4,2008,7) --> xem AL ngày 12/04/2008, múi giờ thứ 7 :D

Nó sẽ trả về: Nha6m Ngo5//Bi1nh Thi2n//Ma65u Ty1//Canh Ty1//7/3/2008//0

Dịch nghĩa: (vui lòng dùng kèm hàm chuyển VNI2UNI để chuyển thành unicode)
-Giờ Canh Tý
-Ngày Nhâm Ngọ
-Tháng Bính Thìn
-Năm Mậu Tý
-Ngày âm: 7/3/2008
-Tham số cuối cùng: nếu = 1 thì tháng đó là tháng nhuần

Tự đánh giá: sử dụng tốt, tuy nhiên không đánh giá được độ chính xác và tầm thời gian hiệu lực đúng là từ năm nào đến năm nào.
User avatar
truongphu
VIP
VIP
Posts: 4781
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 525 times

Re: module xem giờ, ngày,tháng, năm âm lịch

Post by truongphu »

- Quá đã! cảm ơn TrungDung1977 đã sưu tầm (và chỉnh lý?). Tại forum cũ, mục Mẹo vặt \ Chuỗi và Thời gian chỉ có bài của NoBi gởi do Hồ Ngọc Đức viết. Để mang sang diễn đàn mới,tôi đang "đánh vật" với nó trong hơn tuần qua về ý nghĩa các mảng code, hiện sắp xong sẽ gởi lên góp mặt. Tuy nhiên về phương diện code, việc tính toán chỉ dựa vào mảng thông tin 300 năm mà HNĐ đã dày công xây dựng, tuy gọn nhưng chưa "đã", không phổ quát như module trên. (trên các trang web chuyên biệt, có code chức năng tương tự với ngôn ngữ Java nên tôi thua)
- Thấy có Const PI nghĩa là module tính trực tiếp từ đường đi của mặt trời! Hứa hẹn chắc phải cỡ một tháng mới hiểu gần toàn bộ module nầy qua. Tuy thế tôi vẫn đánh giá đây là một tư liệu quý sẽ làm kho kiến thức của CLBVB giàu thêm
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
User avatar
truongphu
VIP
VIP
Posts: 4781
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 525 times

Re: module xem giờ, ngày,tháng, năm âm lịch

Post by truongphu »

Tôi đọc bài trên suốt ngày hôm nay, chỉ hiểu vài cọng râu! Tuy nhiên vì tính ưu việt của nó đành giã từ code HNĐ..(cũng như từ TV đen chuyển qua TV màu vậy)
Có so sánh với Hacalendar, năm 1 đến năm 30 có sai lệch 1 ngày, nhưng biết ai đúng sai?, lại nữa, đó là điều .. không cần thiết trừ các nhà sử học.
Lẽ ra soạn lại bài "Đổi ...của HNĐ" nhưng thôi vì lý do nêu trên. Do định dạng xuất thông tin của TrungDung1977 có nhiều ký tự // nhìn mỏi mắt nên tôi đóng gói ứng dụng trên theo sở thích cá nhân.
Đây là Ứng dụng ăn theo, giúp các bạn đở công mày mò
Xin lỗi trước, một vài đoạn code không quan trọng được chỉnh sửa cho gọn, phần còn lại thì đọc không hiểu nên vẫn còn nguyên.
Code bên dưới
Attachments
untitled.JPG
Module tính âm lich.rar
(6.31 KiB) Downloaded 962 times
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
TrungDung1977
Thành viên chính thức
Thành viên chính thức
Posts: 44
Joined: Tue 15/08/2006 11:19 pm
Location: TPHCM

Re: module xem giờ, ngày,tháng, năm âm lịch

Post by TrungDung1977 »

Rất tiếc phải báo với bác là sau khi xem kĩ và đối chiếu với lịch trên mạng thì module này cho kết quả sai nhiều, cho kết quả sai trong nhiều năm trong khoảng 100 năm lại sai liên tục khoảng 2 năm. Cái này vẫn đúng trong khoảng từ 1901 đến 2261
Mời bác sử dụng cái của vie87vn trong box usercontrol, module. Cái này cho nhiều thông tin và chính xác hơn :D
User avatar
truongphu
VIP
VIP
Posts: 4781
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 525 times

Re: module xem giờ, ngày,tháng, năm âm lịch

Post by truongphu »

cảm ơn vie87vn và TrungDung1977
- TitleBar của form VB6 hoàn toàn không hổ trợ tiếng Việt, do đó thừa, nên bỏ 1 hàm API và sub gọi tiếng Việt cho titlebar
TB: Xin lỗi câu ở trên, nói lại cho rõ là không thể hiện tốt ở XP chế độ windows standard! vậy có thể bỏ hoặc không. Thành thật xin lỗi vie87vn

- Function ToUni của TrungDung1977 ngắn gọn hơn của thuongall nên cần thay thế
- Function VMonthName chưa được ứng dụng, phải gọi ra cho vui. Tôi có viết lại
- Tại txtday, txtMonth, txtYear, khi gõ trị số 0 vô nghĩa, trình vẫn tính toán!, tương tự vẫn chạy với ngày >32, tháng > 12..
Tôi đã fix
- Chỉ nhập dữ liệu bằng cách gõ vào ô rôi nhấn = không thuận tiện, tôi đã bổ sung các nút nhấn +, - và thanh trượt
Nói chung cũng tợ như TV màu cong chuyển qua TV LCD, tuy chưa đọc kỹ code tính toán của Hồ Ngọc Đức.
vie87vn giỏi thiệt!
Xin gởi kèm code
Attachments
888.JPG
LunarCalendar.rar
(25.51 KiB) Downloaded 963 times
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
ngaydautiendihoc
Thành viên danh dự
Thành viên danh dự
Posts: 262
Joined: Mon 12/03/2007 10:55 pm
Location: Hà Giang
Has thanked: 2 times
Been thanked: 1 time
Contact:

Re: module xem giờ, ngày,tháng, năm âm lịch

Post by ngaydautiendihoc »

Code này hình như chuyển từ code Jave của Hồ Ngọc Đức.
Ngày trước tôi cũng đã ngiên cứu cái này và cũng hỏi mọi người nhưng hình như chẳng ai quan tâm.
Trong code trên có rất nhiều hằng số, chẳng biết lấy ở đâu ra, quy luật tính toán như thế nào, chịu không thể hiểu nổi. Có lẽ liên quan đến sự chuyển động của mặt trăng, mặt trời và trái đất, giữa chúng có một sự liên hệ nhất định và có quy luật. Ai am hiểu thiên văn vào giải thích hộ đi.
À mà nhân tiện vụ lịch âm dương này cho tôi hỏi, hiện nay ở VN mình đang sử dụng phương pháp tính nào là chuẩn nhất nhỉ, thấy cứ gần đến tết lại xôn xao về lịch, tranh cãi nhau tùm lum, người thì bảo đúng, người thì bảo sai cha hiểu thế nào cả.
Rồi quan điểm về thời khắc bắt đầu 1 ngày mới: Theo bác Phan Kế Bính thì giờ tý bắt đầu từ 11h đêm nhưng theo một số chỗ khác thì lại nói là bắt đầu từ 0h, ở đây chắc chưa có sự thống nhất. Có lẽ theo giờ TQ thì 11h đêm là thời điểm bắt đầu 1 ngày mới vì Bắc Kinh sớm hơn Hà nội 1h, còn ở VN thì nên áp dụng từ 0h chả biết thế có phải không.
User avatar
truongphu
VIP
VIP
Posts: 4781
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 525 times

Re: module xem giờ, ngày,tháng, năm âm lịch

Post by truongphu »

Rất hoan nghênh ngaydautiendihoc tham gia đề mục
Những suy ngĩ của ngaydautiendihoc cũng là suy nghĩ người trong cuộc (đang tìm hiểu)
Rồi một ngày nào đó../.các vấn đề trên trở thành quá dễ!
Mong có sự đồng cảm.

TB Nếu TrungDung1977 không khó chịu, sao chúng ta không là bạn bè? Lĩnh vực chuyên môn của ai thì kệ người nấy, Chỉ bạn bè qua CODE, TrungDung1977 đang viết cái OCX gì đó cho tiếng Việt là bạn bè của NoBi, thì chuỗi và các vấn đề... sao không là bạn bè của truongphu? :D :D (dù học sau nhưng tiếp thu nhanh!)
hoặc là xuyên qua các bài viết, logic của truongphu rạch ròi, ? = cũng hợp rơ? :x
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
dvh
Posts: 2
Joined: Tue 15/04/2008 4:27 pm

Re: module xem giờ, ngày,tháng, năm âm lịch

Post by dvh »

Tôi cũng có một số thắc mắc liên quan tới thiên văn và lịch:
- Không biết ngày đầu năm âm lịch được tính theo phương pháp nào?
- Có phải Trái Đất luôn quay quanh mặt trời với cùng một quỹ đạo?
- Có phải Mặt Trăng luôn quay quanh Trái Đất với cùng một quỹ đạo?
Kiến thức về lịch của người xưa khác ngày này cho nên muốn tính âm lịch cổ VN và Trung Hoa ghi trong lịch sử có lẽ cần thêm sai số về kiến thức của các nhà làm lịch cổ. Ví dụ sự tiến bộ của thiên văn học giúp tính thời gian quay mặt trời quanh mặt đất chính xác hơn=> đông chí chính xác hơn mà âm và dương lịch đều có cùng đông chí.
Một vài câu hỏi nhỏ mong được trao đổi cùng mọi người.
ngaydautiendihoc
Thành viên danh dự
Thành viên danh dự
Posts: 262
Joined: Mon 12/03/2007 10:55 pm
Location: Hà Giang
Has thanked: 2 times
Been thanked: 1 time
Contact:

Re: module xem giờ, ngày,tháng, năm âm lịch

Post by ngaydautiendihoc »

dvh wrote: - Không biết ngày đầu năm âm lịch được tính theo phương pháp nào?
Cái này bạn xem lại bài viết của HNĐ http://www.informatik.uni-leipzig.de/~duc/amlich/. Đúng hay không cũng chưa thấy có văn bản pháp quy nào nói đến.
dvh wrote: - Có phải Trái Đất luôn quay quanh mặt trời với cùng một quỹ đạo?
- Có phải Mặt Trăng luôn quay quanh Trái Đất với cùng một quỹ đạo?
Cái này thì hiển nhiên rồi, có điều là chu kỳ của nó chính xác thế nào thôi, chúng ta ai cũng biết chu kỳ của trái đất sấp xỉ là 365 ngày lẻ 6 tiếng, chu kỳ của mặt trăng sấp xỉ 29,5 ngày nhưng chính xác hơn nữa thì có lẽ phải nhờ vào các cao thủ về thiên văn.
Như chúng ta đã thấy, năm dương lịch không phải cứ 4 năm lại có 1 năm nhuận (366 ngày - Nhét ngày nhuận vào tháng 2: 29 ngày) vì vậy ở đây có 1 số lẻ nhất định không phải là 6 tiếng/năm nữa.
Tôi ngờ rằng những hằng số lắt nhắt mà HNĐ đưa vào trong Code trên kia nhằm giải quyết độ chính xác của chu kỳ. Có lẽ đó là 1 số lẻ phức tạp nên Code chỉ giải quyết được trong 1 khoảng thời gian nào đó thôi, nếu dài quá sẽ thiếu chính xác.
Chẳng biết có fải thế không, mọi người cùng tiếp tục mổ xẻ nhé.
User avatar
truongphu
VIP
VIP
Posts: 4781
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 525 times

Re: module xem giờ, ngày,tháng, năm âm lịch

Post by truongphu »

Dưới đây là các hiểu biết còn hạn chế của tôi, xin trao đổi cùng ngaydautiendihoc và dvh. Nên tham khảo các bài viết về lịch của Hồ Ngọc Đức, Giáo trình thiên văn Phạm Viết Trinh - Nguyễn Đình Noãn

Đến ngaydautiendihoc
- quy luật tính toán như thế nào?
Trả lời: Nguyên lý thì đơn giản mà thuật toán quá phức tạp như ngaydautiendihoc hỏi: "Trong code trên có rất nhiều hằng số, chẳng biết lấy ở đâu ra ...?)
Nguyên lý: Tính số ngày giữa 2 mốc thời gian. Do mốc 1 đã biết số liệu, đếm rợ dần dần đến mốc 2!
Thuật toán: Dương lịch Julius Caesar dư ngày trong nhiều năm. Đến năm 1582 Giáo Hoàng Gregory XIII quyết định bỏ 10 ngày trong tháng 10 năm đó và bổ sung thêm cách tính năm nhuận Dl, vì lý do trên tính DateDiff khá lúng túng.
Hằng Pi phục vụ trong tính quỹ đạo trái đất để xác định các điểm Sóc (ngày 1 = Trời-Trăng-Đất thẳng hàng) , các điểm Trung khí (Mốc 1/12 quỹ đạo, tính từ vd xuân phân)

- ở VN mình đang sử dụng phương pháp tính nào là chuẩn?
Trả lời: Có cơ quan chuyên trách, tựu trung như cách tính Hồ Ngọc Đức, Phải là múi giờ 7

- đến tết lại xôn xao về lịch, tranh cãi nhau tùm lum?
Trả lời: Lịch Trung quốc tính trên múi giờ 8, thỉnh thoảng các số liệu của lịch VN và TQ chênh nhau. Không phải vì tự ái dân tộc mà vì chúng ta đang sống trên múi giờ 7 nên dùng lịch dựa múi giờ 7 là chính xác nhất

- bác Phan Kế Bính thì giờ tý bắt đầu từ 11h đêm?
Trả lời: Thiếu logic: 11 giờ (đêm) = ngày cũ, Tý giờ khởi đầu ngày mới làm sao gán ghép như thế?

- Có lẽ theo giờ TQ thì...?
Trả lời: giờ khởi đầu ngày mới chỉ lệ thuộc địa phương

Đến dvh
- Không biết ngày đầu năm âm lịch được tính theo phương pháp nào?

Trả lời: Tính khoảng cách giữa 2 ngày Đông chí liên tiếp
Nếu dưới 365 ngày = dễ, ngày đầu năm âm lịch đó là ngày Sóc thứ 2 sau ngày Đông chí thứ nhất
Nếu trên 365 ngày: có tháng nhuận.
- nếu tháng nhuận là tháng từ 1 - 10 ngày đầu năm âm lịch đó là ngày Sóc thứ 2 sau ngày Đông chí thứ nhất
- nếu tháng nhuận là tháng 11 hoặc 12 ngày đầu năm âm lịch đó là ngày Sóc thứ 3 sau ngày Đông chí thứ nhất.

- Có phải Trái Đất luôn quay quanh mặt trời với cùng một quỹ đạo?

Trả lời: Xét trong thời gian ngắn vài trăm ngàn năm (so với 4 tỷ năm tuổi) thì đúng như thế

- Có phải Mặt Trăng luôn quay quanh Trái Đất với cùng một quỹ đạo?

Trả lời: Như câu trên

Kiến thức về lịch của người xưa khác ngày này cho nên muốn tính âm lịch cổ VN và Trung Hoa ghi trong lịch sử có lẽ cần thêm sai số về kiến thức của các nhà làm lịch cổ. Ví dụ sự tiến bộ của thiên văn học giúp tính thời gian quay mặt trời quanh mặt đất chính xác hơn=> đông chí chính xác hơn mà âm và dương lịch đều có cùng đông chí.

Trả lời: âm lịch cổ chỉ dựa vào mặt trăng để tính ngày tháng năm nên sai so với chu kỳ mùa, chỉ có giá trị lịch sử
Âm lịch hiện đại là âm lịch có pha dương lịch = Âm Dương lịch, tính lịch âm nhưng dựa trên các điểm mốc của vị trí trái đất trên qũy đạo.
Các mốc quan trọng và dễ nhớ: Xuân phân (khỏang 21/3 DL), Hạ chí (khoảng 22/6 DL), Thu phân (khoảng 23/9 DL) và Đông chí (khoảng 22/12 DL). Mốc Đông chí có nhắc đến trên
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
User avatar
truongphu
VIP
VIP
Posts: 4781
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 525 times

Lịch âm dương 2009, code gọn

Post by truongphu »

Thủ thuật: Lịch âm dương 2009, code gọn
Tác giả: truongphu
Mô tả: Lịch âm dương 2009

Code: Select all

Dim Ngay, TenN, Thang, TenT, Nam, TenNa, NhPrivate Function ToAL(data As Date)Dim Can() As String, Chi() As String, N As BooleanDim DL() As String, i As Byte, days As Byte, cach As IntegerDL = Split("5,A,A,B,A,B,A,B,B,A,B,A,B,A", ",")cach = DateDiff("d", #1/1/2009#, data) + 6  Thang = 12    For i = 1 To 13            If cach >= 30 Then            If DL(i) = "A" Then days = 30 Else days = 29            cach = cach - days            If i = DL(0) + 1 Then            Thang = Thang            N = True            Else            Thang = Thang + 1            End If            If Thang > 12 Then Thang = Thang - 12        End If        If cach <= 29 Then Exit For    NextNgay = cachIf Ngay = 0 Then Ngay = 30Can = Split("Canh,Tân,Nhâm,Qúy,Giáp,Ât,Bính,Ðinh,Mâu,Ky", ",")Chi = Split("Thân,Dâu,Tuât,Ho'i,Tý,Suu,Dân,Mao,Thìn,Ty,Ngo,Mùi", ",")TenN = Can(DateDiff("d", #4/1/1800#, data) Mod 10) & " " & Chi(DateDiff("d", #4/1/1800#, data) Mod 12)If Thang = 12 Then Nam = 2008 Else Nam = 2009TenT = Can((Nam * 12 + Thang + 7) Mod 10) & " " & Chi((Thang + 5) Mod 12)If Thang = 12 Then TenNa = "Mâu Tý" Else TenNa = "Ky Suu"If N = True Then Nh = " (Nh)" Else Nh = ""End Function Private Sub HScroll1_Change()Dim DMY As DateDMY = CDate(HScroll2.Value & "/" & HScroll1.Value & "/" & "2009")Label1.Caption = Day(DMY) & "/" & Month(DMY) & "/2009"Text1 = ToAL(DMY)Text1 = "Ngày " & TenN & vbCrLf & "Tháng " & TenT & Nh & vbCrLf & "Nam " & TenNa & vbCrLf & Ngay & "/" & Thang & "/" & NamEnd Sub Private Sub HScroll2_Change()Call HScroll1_ChangeEnd Sub 
Attachments
untitled.JPG
untitled.JPG (12.65 KiB) Viewed 12583 times
Nam 2009.rar
(1.92 KiB) Downloaded 667 times
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
User avatar
vie87vn
Thành viên tích cực
Thành viên tích cực
Posts: 150
Joined: Sat 05/04/2008 10:15 am
Location: Quán Đôi - Củ Chi
Been thanked: 2 times
Contact:

Re: module xem giờ, ngày,tháng, năm âm lịch

Post by vie87vn »

Cám ơn các bạn quan tâm tới bài viết của mình.
Mã nguồn hoàn toàn của Hồ Ngọc Đức, mình chỉ chuyển đổi và tìm hiểu, kiểm tra cho chính xác so với lịch của Hồ Ngọc Đức.
Lịch trên là hoàn toàn sử dụng theo múi giờ +7 của Việt Nam, tức không đúng so với lịch sử, vì 1 thời gian chúng ta dùng múi giờ +8 nên thời gian lịch sử sẽ khác với lịch này.
Xem thủ thuật làm lịch trên trang của Hồ Ngọc Đức, mình ra kết quả sai rất nhiều. Từ mã nguồn Java thì chính xác hơn.

@truongphu: Cái project trên mình chỉ làm ví dụ cho cái module mình dịch từ mã nguồn Java của HNĐ thôi. Việc ngày >31, tháng >12 và trả về giá trị 0 khi không có ngày tháng năm nhuận thì các bạn tự bẫy lỗi trong quá trình thiết kế 1 chương trình của mình. Vì thế nên ví dụ này mình không bẫy lỗi.
Về việc hàm VMonthName mình tạo ra là lý do: Tháng 1 mình gọi là tháng giêng, còn Dương lịch vẫn là tháng một, tháng 12 gọi là tháng chạp, trong khi Dương lịch vẫn gọi là tháng mười hai và đặc biệt là ... quên lôi ra dùng.
Hoàng Sa và Trường Sa là của Việt Nam.
btamsgn
Thành viên chính thức
Thành viên chính thức
Posts: 47
Joined: Thu 10/04/2008 4:40 pm
Has thanked: 3 times

Re: module xem giờ, ngày,tháng, năm âm lịch

Post by btamsgn »

Code không dùng được trong VBA của excel

của tác giả Nguyễn Quốc San bên trang Ho Ngoc Duc thì ok cả VB và excel
thuntpd00531
Posts: 1
Joined: Fri 31/05/2013 5:05 pm

nhờ các bạn cho ý tưởng from quan lý sinh viên

Post by thuntpd00531 »

Tên:
Loại:
Ngôn ngữ lập trình:
Tác giả: Sưu tầm
Chức năng:
chào các bạn, mình đang học môn vb mình đang định làm một phần mềm quản lý sinh viên, trên vb. Nhưng mình chưa có ý tưởng các bạn nào đã làm trên phần mền vb giúp đỡ mình với
Post Reply

Return to “[VB] Chuỗi và Thời gian”