• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

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
TrungDung1977
Thành viên chính thức
Thành viên chính thức
Bài viết: 44
Ngày tham gia: T.Ba 15/08/2006 11:19 pm
Đến từ: TPHCM

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

Gửi bàigửi bởi TrungDung1977 » T.Hai 14/04/2008 12:01 am

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



Mã: Chọn hết

  1. Private Type solardate
  2.     solarday As Integer
  3.     solarmonth As Integer
  4.     solaryear As Integer
  5. End Type
  6. Private Type solarlunar
  7.     sdate As solardate
  8.     evallunar As Integer
  9.     leapmoon As Integer 'chi co hai gia tri la 0 hoac 1
  10. End Type
  11. Private Type lunardate
  12.     lunarday As Integer
  13.     lunarmonth As Integer
  14.     lunaryear As Integer
  15.     leapmoon As Integer 'chi co hai gia tri la 0 hoac 1
  16. End Type
  17.  
  18. Const PI = 3.14159265358979 + 3.238462643383E-15 + 2.795E-28
  19.  
  20. Private Function UniversalToJD(ByVal solarday As Integer, ByVal solarmonth As Integer, ByVal solaryear As Integer) As Double
  21. 'tra ve 1  ngay julius cua ngay duong lich
  22.     Dim jd As Double
  23.         If (solaryear > 1582 Or (solaryear = 1582 And solarmonth > 10) Or (solaryear = 1582 And solarmonth = 10 And solarday > 14)) Then
  24.             jd = 367
  25.             jd = jd * solaryear
  26.             jd = jd - Int(7 * (solaryear + Int((solarmonth + 9) / 12)) / 4)
  27.             jd = jd - Int(3 * (Int((solaryear + (solarmonth - 9) / 7) / 100) + 1) / 4)
  28.             jd = jd + Int(275 * solarmonth / 9)
  29.             jd = jd + solarday
  30.             jd = jd + 1721028.5
  31.         Else
  32.             jd = 367
  33.             jd = jd * solaryear
  34.             jd = jd - Int(7 * (solaryear + 5001 + Int((solarmonth - 9) / 7)) / 4)
  35.             jd = jd + Int(275 * solarmonth / 9)
  36.             jd = jd + solarday
  37.             jd = jd + 1729776.5
  38.         End If
  39.         UniversalToJD = jd
  40. End Function
  41.  
  42.  
  43. Private Function solar2lunar(ByVal solarday As Integer, ByVal solarmonth As Integer, ByVal solaryear As Integer, ByVal local_timezone As Byte) As lunardate
  44.     Dim ly() As solarlunar
  45.     Dim jdToday, jdMonth11 As Double
  46.     Dim month11 As solardate
  47.     Dim i, dd, mm, yy As Integer
  48.         yy = solaryear
  49.         lunaryear solaryear, ly(), local_timezone
  50.         month11 = ly(UBound(ly)).sdate
  51.         jdToday = LocalToJD(solarday, solarmonth, solaryear, local_timezone)
  52.         jdMonth11 = LocalToJD(month11.solarday, month11.solarmonth, month11.solaryear, local_timezone)
  53.         If (jdToday >= jdMonth11) Then
  54.             lunaryear solaryear + 1, ly(), local_timezone
  55.             yy = solaryear + 1
  56.         End If
  57.         i = UBound(ly)
  58.         Do While (jdToday < LocalToJD(ly(i).sdate.solarday, ly(i).sdate.solarmonth, ly(i).sdate.solaryear, local_timezone))
  59.                 i = i - 1
  60.         Loop
  61.         dd = Int(jdToday - LocalToJD(ly(i).sdate.solarday, ly(i).sdate.solarmonth, ly(i).sdate.solaryear, local_timezone)) + 1
  62.         mm = ly(i).evallunar
  63.         If (mm >= 11) Then
  64.                 yy = yy - 1
  65.         End If
  66.         With solar2lunar
  67.             .leapmoon = ly(i).leapmoon
  68.             .lunarday = dd
  69.             .lunarmonth = mm
  70.             .lunaryear = yy
  71.         End With
  72. End Function
  73.  
  74. Private Sub lunaryear(ByVal solaryear As Integer, ret() As solarlunar, ByVal local_timezone As Byte)
  75.     Dim jdmonth11A, off As Double
  76.     Dim k, i, foundI, j As Integer
  77.     Dim sunlongitudes(1 To 14) As Double
  78.     Dim foundB, hasMajorTerm, p1, p2, leap As Boolean
  79.     Dim sl1, sl2, sl3, sl4, kl As Double
  80.     Dim SUNLONG_MAJOR(1 To 12) As Double
  81.         jdmonth11A = LocalToJD(LunarMonth11(solaryear - 1, local_timezone).solarday, LunarMonth11(solaryear - 1, local_timezone).solarmonth, LunarMonth11(solaryear - 1, local_timezone).solaryear, local_timezone)
  82.         k = Int(0.5 + (jdmonth11A - 2415021.07699869 - 0.000000005) / 29.530588853)
  83.         'k la ngay soc cua mong 1 thang 11 nam solaryear -1
  84.         off = LocalToJD(LunarMonth11(solaryear, local_timezone).solarday, LunarMonth11(solaryear, local_timezone).solarmonth, LunarMonth11(solaryear, local_timezone).solaryear, local_timezone) - jdmonth11A
  85.         leap = off > 365
  86.         If leap Then
  87.             ReDim Preserve ret(1 To 14)
  88.             'neu la nam nhuan thi tu thang 11 nam nay den thang 11nam sua se co 14 ngay soc tat ca
  89.         Else
  90.             ReDim Preserve ret(1 To 13)
  91.             'neu khong nhuan thi se co 13 ngay soc  tat ca
  92.         End If
  93.         For i = 1 To UBound(ret)
  94.             With ret(i)
  95.                 .sdate = LocalFromJD(NewMoon(k + i - 1), local_timezone)
  96.                 .evallunar = MOD1(i + 10, 12)
  97.                 .leapmoon = 0
  98.             End With
  99.         Next
  100.         If (leap) Then
  101.         'den day thi chac chan nam nay se la nam nhuan
  102.         'nen so ngay soc se la 14 ngay trong nam
  103.             For i = 0 To 11
  104.                 SUNLONG_MAJOR(i + 1) = i * PI / 6
  105.             Next
  106.             'tao ra 12 tiet khi tu (0 den 11)*pi/6
  107.             For i = 1 To 14
  108.                 kl = LocalToJD(ret(i).sdate.solarday, ret(i).sdate.solarmonth, ret(i).sdate.solaryear, local_timezone)
  109.                 sunlongitudes(i) = SunLongitude(kl)
  110.             Next
  111.             'tinh ra trung khi cua nhung thang am lich
  112.             foundB = False
  113.             For i = 1 To 13
  114.                 sl1 = sunlongitudes(i)
  115.                 sl2 = sunlongitudes(i + 1)
  116.                 'trung khi cua hai thang lien tiep
  117.                 hasMajorTerm = False
  118.                 For j = 1 To 11
  119.                     sl3 = SUNLONG_MAJOR(j)
  120.                     sl4 = SUNLONG_MAJOR(j + 1)
  121.                     p1 = ((sl3 < sl1) And (sl1 < sl2) And (sl2 < sl4))
  122.                     p2 = ((sl3 < sl2) And (sl2 < sl1) And (sl1 < sl4))
  123.                     If (p1 Or p2) Then
  124.                         hasMajorTerm = True
  125.                     End If
  126.                     If hasMajorTerm Then
  127.                         ret(i).leapmoon = 1
  128.                         ret(i).evallunar = MOD1(i + 9, 12)
  129.                         foundB = True
  130.                         foundI = i
  131.                         Exit For
  132.                     End If
  133.                 Next
  134.                 If foundB Then
  135.                     Exit For
  136.                 End If
  137.             Next
  138.             For i = foundI + 1 To 14
  139.                 ret(i).evallunar = MOD1(i + 9, 12)
  140.             Next
  141.         End If
  142. End Sub
  143.  
  144. Private Function LocalFromJD(ByVal jd As Double, ByVal local_timezone As Byte) As solardate
  145. 'tra ve ngay ,thang ,nam  cua nam duong lich cho 1 ngay julius tuong ung voi mui gio
  146.  
  147.         LocalFromJD = UniversalFromJD(jd + local_timezone / 24)
  148. End Function
  149.  
  150. Private Function LocalToJD(ByVal solarday As Integer, ByVal solarmonth As Integer, ByVal solaryear As Integer, ByVal local_timezone As Byte) As Double
  151. 'tra ve 1  ngay julius cua ngay duong lich voi mui gio
  152.         LocalToJD = UniversalToJD(solarday, solarmonth, solaryear) - local_timezone / 24
  153. End Function
  154.  
  155. Private Function LunarMonth11(ByVal solaryear As Integer, ByVal local_timezone As Byte) As solardate
  156. 'tính thang am lich chua Ðong chi
  157. 'tra ve ngay mong 1 thang 11 am cua  nam solaryear
  158.     Dim off, jd, sunLong As Double
  159.     Dim k As Integer
  160.     Dim ret As solardate
  161.         off = LocalToJD(31, 12, solaryear, local_timezone) - 2415021.07699869 - 0.000000005
  162.         k = Int(off / 29.530588853)
  163.         jd = NewMoon(k)
  164.         ret = LocalFromJD(jd, local_timezone)
  165.         sunLong = SunLongitude(LocalToJD(ret.solarday, ret.solarmonth, ret.solaryear, local_timezone))
  166.         If (sunLong > 3 * PI / 2) Then
  167.             jd = NewMoon(k - 1)
  168.         End If
  169.     LunarMonth11 = LocalFromJD(jd, local_timezone)
  170. End Function
  171.  
  172. Private Function NewMoon(ByVal k As Integer) As Double
  173. 'tra ve gia tri cua ngay julius tuong ung voi ngay soc thu k
  174.     Dim T, T2, T3, dr, JD1, M, Mpr, f, C1, deltat, JdNew
  175.         T = k / 1236.85 '// Time in Julian centuries from 1900 January 0.5
  176.         T2 = T * T
  177.         T3 = T2 * T
  178.         dr = PI / 180
  179.         JD1 = 2415020.75933 + 29.53058868 * k + 0.0001178 * T2 - 0.000000155 * T3
  180.         JD1 = JD1 + 0.00033 * Math.Sin((166.56 + 132.87 * T - 0.009173 * T2) * dr) ' // Mean new moon
  181.         M = 359.2242 + 29.10535608 * k - 0.0000333 * T2 - 0.00000347 * T3 ' // Sun's mean anomaly
  182.         Mpr = 306.0253 + 385.81691806 * k + 0.0107306 * T2 + 0.00001236 * T3 ' // Moon's mean anomaly
  183.         f = 21.2964 + 390.67050646 * k - 0.0016528 * T2 - 0.00000239 * T3 ' // Moon's argument of latitude
  184.         C1 = (0.1734 - 0.000393 * T) * Math.Sin(M * dr) + 0.0021 * Math.Sin(2 * dr * M)
  185.         C1 = C1 - 0.4068 * Math.Sin(Mpr * dr) + 0.0161 * Math.Sin(dr * 2 * Mpr)
  186.         C1 = C1 - 0.0004 * Math.Sin(dr * 3 * Mpr)
  187.         C1 = C1 + 0.0104 * Math.Sin(dr * 2 * f) - 0.0051 * Math.Sin(dr * (M + Mpr))
  188.         C1 = C1 - 0.0074 * Math.Sin(dr * (M - Mpr)) + 0.0004 * Math.Sin(dr * (2 * f + M))
  189.         C1 = C1 - 0.0004 * Math.Sin(dr * (2 * f - M)) - 0.0006 * Math.Sin(dr * (2 * f + Mpr))
  190.         C1 = C1 + 0.001 * Math.Sin(dr * (2 * f - Mpr)) + 0.0005 * Math.Sin(dr * (2 * Mpr + M))
  191.         If (T < -11) Then
  192.             deltat = 0.001 + 0.000839 * T + 0.0002261 * T2 - 0.00000845 * T3 - 0.000000081 * T * T3
  193.         Else
  194.             deltat = -0.000278 + 0.000265 * T + 0.000262 * T2
  195.         End If
  196.         JdNew = JD1 + C1 - deltat
  197.     NewMoon = JdNew
  198. End Function
  199.  
  200. Private Function MOD1(ByVal x As Long, ByVal y As Long) As Long
  201. 'tra ve gia tri cua so du  khi x chia cho y
  202.     Dim Z
  203.         Z = x - (y * Int(x / y))
  204.         If Z = 0 Then
  205.             Z = y
  206.         End If
  207.         MOD1 = Z
  208. End Function
  209.  
  210. Private Function SunLongitude(ByVal jdn As Double) As Double
  211. 'tra ve trung khi cua thang
  212.     Dim T, T2, dr, M, L0, DL, l
  213.         T = (jdn - 2451545) / 36525  ' // Time in Julian centuries from 2000-01-01 12:00:00 GMT
  214.         T2 = T * T
  215.         dr = PI / 180 ' // degree to radian
  216.         M = 357.5291 + 35999.0503 * T - 0.0001559 * T2 - 0.00000048 * T * T2 ' // mean anomaly, degree
  217.         L0 = 280.46645 + 36000.76983 * T + 0.0003032 * T2 ' // mean longitude, degree
  218.         DL = (1.9146 - 0.004817 * T - 0.000014 * T2) * Math.Sin(dr * M)
  219.         DL = DL + (0.019993 - 0.000101 * T) * Math.Sin(dr * 2 * M) + 0.00029 * Math.Sin(dr * 3 * M)
  220.         l = L0 + DL ' // true longitude, degree
  221.         l = l * dr
  222.         l = l - PI * 2 * (Int(l / (PI * 2))) ' // Normalize to (0, 2*PI)
  223.     SunLongitude = l
  224. End Function
  225.  
  226.  
  227. Private Function UniversalFromJD(ByVal jd As Double) As solardate
  228. 'tra ve ngay ,thang ,nam  cua nam duong lich cho 1 ngay julius tuong ung
  229.         Dim Z, A, alpha, B, C, D, E, dd, mm, yyyy
  230.         Dim f As Double
  231.         Z = Int(jd + 0.5)
  232.         f = (jd + 0.5) - Z
  233.         If (Z < 2299161) Then
  234.             A = Z
  235.         Else
  236.             alpha = Int((Z - 1867216.25) / 36524.25)
  237.             A = Z + 1 + alpha - Int(alpha / 4)
  238.         End If
  239.         B = A + 1524
  240.         C = Int((B - 122.1) / 365.25)
  241.         D = Int(365.25 * C)
  242.         E = Int((B - D) / 30.6001)
  243.         dd = Int(B - D - Int(30.6001 * E) + f)
  244.         If (E < 14) Then
  245.             mm = E - 1
  246.         Else
  247.             mm = E - 13
  248.         End If
  249.         If (mm < 3) Then
  250.             yyyy = C - 4715
  251.         Else
  252.             yyyy = C - 4716
  253.         End If
  254.         With UniversalFromJD
  255.             .solarday = dd
  256.             .solarmonth = mm
  257.             .solaryear = yyyy
  258.         End With
  259. End Function
  260.  
  261.  
  262. Public Function LayThoiGianAL(ByVal solarday As Integer, ByVal solarmonth As Integer, ByVal solaryear As Integer, ByVal local_timezone As Byte) As String
  263.     Dim Esteam(9) As String
  264.     Dim Ebranch(11) As String
  265.     Dim Vsteam(9) As String
  266.     Dim Vbranch(11) As String
  267.     Dim ld, lm, ly, llm As Integer
  268.     Dim str$
  269.         'khai bao thien can tieng anh
  270.         Esteam(0) = "Jia":        Esteam(1) = "Yi":        Esteam(2) = "Bing":        Esteam(3) = "Ding"
  271.         Esteam(4) = "Wu":        Esteam(5) = "Ji":        Esteam(6) = "Geng":        Esteam(7) = "Xin"
  272.         Esteam(8) = "Ren":        Esteam(9) = "Gui"
  273.         'khai bao thien can tieng viet
  274.         Vsteam(0) = "Gia1p":        Vsteam(1) = "A61t":        Vsteam(2) = "Bi1nh":        Vsteam(3) = "D9inh"
  275.         Vsteam(4) = "Ma65u":        Vsteam(5) = "Ky3":        Vsteam(6) = "Canh":        Vsteam(7) = "Ta6n"
  276.         Vsteam(8) = "Nha6m":        Vsteam(9) = "Quy1"
  277.         'khai bao dia chi tieng anh
  278.         Ebranch(0) = "zi":        Ebranch(1) = "chou":        Ebranch(2) = "Yin":        Ebranch(3) = "Mao"
  279.         Ebranch(4) = "Chen":        Ebranch(5) = "Si":        Ebranch(6) = "wu":        Ebranch(7) = "Wei"
  280.         Ebranch(8) = "Shen":        Ebranch(9) = "You":        Ebranch(10) = "Xu":        Ebranch(11) = "Hai"
  281.         'khai bao dia chi tieng viet
  282.         Vbranch(0) = "Ty1":        Vbranch(1) = "Su73u":        Vbranch(2) = "Da62n":        Vbranch(3) = "Ma4o"
  283.         Vbranch(4) = "Thi2n":        Vbranch(5) = "Ty5":        Vbranch(6) = "Ngo5":        Vbranch(7) = "Mu2i"
  284.         Vbranch(8) = "Tha6n":        Vbranch(9) = "Da65u":        Vbranch(10) = "Tua61t":        Vbranch(11) = "Ho75i"
  285.        
  286.         With solar2lunar(solarday, solarmonth, solaryear, local_timezone)
  287.             ld = .lunarday
  288.             lm = .lunarmonth
  289.             ly = .lunaryear
  290.             llm = .leapmoon
  291.         End With
  292.        
  293.         'tao ngay can chi
  294.         str = Vsteam(Int(UniversalToJD(solarday, solarmonth, solaryear) + 9.5) Mod 10)
  295. '        AALdaySBsteam.Caption = Esteam(Int(UniversalToJD(solarday, solarmonth, solaryear) + 9.5) Mod 10)
  296.         str = str & " " & Vbranch(Int(UniversalToJD(solarday, solarmonth, solaryear) + 1.5) Mod 12)
  297. '        AALdaySBbranch.Caption = Ebranch(Int(UniversalToJD(solarday, solarmonth, solaryear) + 1.5) Mod 12)
  298.         str = str & "//"
  299.  
  300. '        'tao thang can chi
  301.         str = str & Vsteam((ly * 12 + lm + 3) Mod 10)
  302.        
  303. '        AALmoonSBsteam.Caption = Esteam((ly * 12 + lm + 3) Mod 10)
  304. '        AALmoonSBbranch.Caption = Ebranch((lm + 1) Mod 12)
  305.         str = str & " " & Vbranch((lm + 1) Mod 12)
  306.        
  307.         str = str & "//"
  308.  
  309. '        If llm Then
  310. '            Vleapmonth.Caption = "(N)"
  311. '            Eleapmonth.Caption = "(L)"
  312. '        Else
  313. '            Vleapmonth.Caption = ""
  314. '            Eleapmonth.Caption = ""
  315. '        End If
  316.        
  317.        
  318.         'tao nam can chi
  319.         str = str & Vsteam((ly + 6) Mod 10)
  320. '        AALyearSBsteam.Caption = Esteam((ly + 6) Mod 10)
  321.         str = str & " " & Vbranch((ly + 8) Mod 12)
  322. '        AALyearSBbranch.Caption = Ebranch((ly + 8) Mod 12)
  323.        
  324.         str = str & "//"
  325.         'tao gio can chi
  326.         str = str & Vsteam(((Int(UniversalToJD(solarday, solarmonth, solaryear) + 9.5) Mod 10) Mod 5) * 2)
  327. '        AALhoursteam.Caption = Esteam(((Int(UniversalToJD(solarday, solarmonth, solaryear) + 9.5) Mod 10) Mod 5) * 2)
  328.        
  329.        
  330.         LayThoiGianAL = str & " Ty1//" & ld & "/" & lm & "/" & ly & "//" & llm
  331.  
  332. 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.



Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

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

Gửi bàigửi bởi truongphu » T.Hai 14/04/2008 6:26 am

- 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

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

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

Gửi bàigửi bởi truongphu » T.Hai 14/04/2008 6:39 pm

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
Tập tin đính kèm
untitled.JPG
Module tính âm lich.rar
(6.31 KiB) Đã tải 826 lần
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
Bài viết: 44
Ngày tham gia: T.Ba 15/08/2006 11:19 pm
Đến từ: TPHCM

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

Gửi bàigửi bởi TrungDung1977 » T.Hai 14/04/2008 11:58 pm

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

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

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

Gửi bàigửi bởi truongphu » T.Ba 15/04/2008 10:22 am

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
Tập tin đính kèm
888.JPG
LunarCalendar.rar
(25.51 KiB) Đã tải 842 lần
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

ngaydautiendihoc
Thành viên danh dự
Thành viên danh dự
Bài viết: 261
Ngày tham gia: T.Hai 12/03/2007 10:55 pm
Đến từ: Hà Giang
Has thanked: 2 time
Been thanked: 1 time
Liên hệ:

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

Gửi bàigửi bởi ngaydautiendihoc » T.Ba 15/04/2008 5:16 pm

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.

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

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

Gửi bàigửi bởi truongphu » T.Ba 15/04/2008 9:23 pm

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
Bài viết: 2
Ngày tham gia: T.Ba 15/04/2008 4:27 pm

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

Gửi bàigửi bởi dvh » T.Ba 15/04/2008 10:54 pm

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ự
Bài viết: 261
Ngày tham gia: T.Hai 12/03/2007 10:55 pm
Đến từ: Hà Giang
Has thanked: 2 time
Been thanked: 1 time
Liên hệ:

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

Gửi bàigửi bởi ngaydautiendihoc » T.Tư 16/04/2008 9:11 am

dvh đã viết:- 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 đã viết:- 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é.

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

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

Gửi bàigửi bởi truongphu » T.Tư 16/04/2008 10:40 am

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

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

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

Gửi bàigửi bởi truongphu » T.Tư 16/04/2008 4:27 pm

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


Mã: Chọn hết

  1. Dim Ngay, TenN, Thang, TenT, Nam, TenNa, Nh
  2. Private Function ToAL(data As Date)
  3. Dim Can() As String, Chi() As String, N As Boolean
  4. Dim DL() As String, i As Byte, days As Byte, cach As Integer
  5. DL = Split("5,A,A,B,A,B,A,B,B,A,B,A,B,A", ",")
  6. cach = DateDiff("d", #1/1/2009#, data) + 6
  7.   Thang = 12
  8.     For i = 1 To 13
  9.             If cach >= 30 Then
  10.             If DL(i) = "A" Then days = 30 Else days = 29
  11.             cach = cach - days
  12.             If i = DL(0) + 1 Then
  13.             Thang = Thang
  14.             N = True
  15.             Else
  16.             Thang = Thang + 1
  17.             End If
  18.             If Thang > 12 Then Thang = Thang - 12
  19.         End If
  20.         If cach <= 29 Then Exit For
  21.     Next
  22. Ngay = cach
  23. If Ngay = 0 Then Ngay = 30
  24. Can = Split("Canh,Tân,Nhâm,Qúy,Giáp,Ât,Bính,Ðinh,Mâu,Ky", ",")
  25. Chi = Split("Thân,Dâu,Tuât,Ho'i,Tý,Suu,Dân,Mao,Thìn,Ty,Ngo,Mùi", ",")
  26. TenN = Can(DateDiff("d", #4/1/1800#, data) Mod 10) & " " & Chi(DateDiff("d", #4/1/1800#, data) Mod 12)
  27. If Thang = 12 Then Nam = 2008 Else Nam = 2009
  28. TenT = Can((Nam * 12 + Thang + 7) Mod 10) & " " & Chi((Thang + 5) Mod 12)
  29. If Thang = 12 Then TenNa = "Mâu Tý" Else TenNa = "Ky Suu"
  30. If N = True Then Nh = " (Nh)" Else Nh = ""
  31. End Function
  32.  
  33. Private Sub HScroll1_Change()
  34. Dim DMY As Date
  35. DMY = CDate(HScroll2.Value & "/" & HScroll1.Value & "/" & "2009")
  36. Label1.Caption = Day(DMY) & "/" & Month(DMY) & "/2009"
  37. Text1 = ToAL(DMY)
  38. Text1 = "Ngày " & TenN & vbCrLf & "Tháng " & TenT & Nh & vbCrLf & "Nam " & TenNa & vbCrLf & Ngay & "/" & Thang & "/" & Nam
  39. End Sub
  40.  
  41. Private Sub HScroll2_Change()
  42. Call HScroll1_Change
  43. End Sub
  44.  
Tập tin đính kèm
untitled.JPG
untitled.JPG (12.65 KiB) Đã xem 7735 lần
Nam 2009.rar
(1.92 KiB) Đã tải 542 lần
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
vie87vn
Thành viên tích cực
Thành viên tích cực
Bài viết: 150
Ngày tham gia: T.Bảy 05/04/2008 10:15 am
Đến từ: Quán Đôi - Củ Chi
Been thanked: 2 time
Liên hệ:

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

Gửi bàigửi bởi vie87vn » T.Sáu 18/04/2008 8:42 pm

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
Bài viết: 47
Ngày tham gia: T.Năm 10/04/2008 4:40 pm
Has thanked: 3 time

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

Gửi bàigửi bởi btamsgn » T.Sáu 31/05/2013 4:02 pm

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
Bài viết: 1
Ngày tham gia: T.Sáu 31/05/2013 5:05 pm

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

Gửi bàigửi bởi thuntpd00531 » T.Bảy 01/06/2013 4:34 pm

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


Quay về “[VB] Chuỗi và Thời gian”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách