PDA

View Full Version : [Q] Đổi ngày âm lịch <-> dương lịch



baotrung
09-01-2003, 08:05
Các members ơi!

Tôi đang cần một giải thuật hay phương thức nào để đổi ngày
dương lịch sang âm lịch và ngược lại, bạn nào biết chỉ tôi với.

Thanks nhiều lắm.

Nicky
09-01-2003, 19:41
Hình như trong quyển sách lập trình Access của Ông Văn Thông có nói cái giải thuật đó (ngôn ngữ Access nhưng không có gì khác với VB đâu).
Tìm thử xem sao nhé.

baotrung
10-01-2003, 08:19
Giá như có tài liệu trên mạng luôn thì hay wá, chứ ra tiệm thì biết còn hay không, sách tên gì... Nếu bạn nào đã từng program thì cho mình xin giải thuật.

Nicky
10-01-2003, 21:18
Ok minh sẽ Post lên cho nhưng nó chỉ đổi năm dương lịch sang âm lịch thui ..

baotrung
16-01-2003, 11:23
Hi Nicky!

Mình chờ bạn post lên lău wá, vậy khi nào mới Post lên cho mình
dây. Cảm ơn bạn trước nhé.

White_Rose
17-01-2003, 02:19
Hic, tui cũng chờ dài cả cổ ra đây :((
Lên mạng tìm được một cái viết = C nhưng nó chỉ cho đổi các năm từ 1->~700. tức mình delete luôn.

quyda
17-01-2003, 16:16
Thử tìm của mấy cha viết ct tử vi xem!

Nicky
17-01-2003, 19:35
aaaaaaa...I'm Sorry !
Quyển sách đó Nicky tìm không ra nhưng vẫn còn nhớ một chút.
Nicky không hiểu về năm âm lịch lém, Can Chi gì đó tùm lum nhưng mà như thế này.
Can thì 10 năm sẽ lặp lại một lần nên muốn tìm Can hãy lấy năm đó chia cho 10 được số dư là x.
Chi thì 12 năm mới lặp lại một lần do đó lấy năm cần tính chia cho 12 được số dư là y.
sau đó đem hai số dư này ứng với Can hoặc Chi gì đó.
Ví dụ năm nay là Quý Mùi.
2003 mod 10 = 3 do đó 3 ứng với Quý, 4 ứng với ... cứ thế tiếp tục vì Nicky không biết sau Quý là gì cả..he..he..
2003 mod 12 = 11 do đó 11 ứng với Mùi sau đó cứ thế tiếp tục.
Thuật toán là như vậy hi vọng mọi người làm được, xin lỗi vì hình như Nicky bị mất gốc rồi chẳng biết gì về âm lịch..

baotrung
18-01-2003, 12:59
Thanks Nicky!

Cách tính không đơn giản như vậy đâu, vì âm lịch có 29 or 30 ngày trong tháng (khác dương lịch tới 31 ngày) và theo chu kỳ nào đó thì 1 năm có đến 2 tháng nhuận , mà những tháng nhuận này thì không cố định, .... do vậy tìm được qui luật để đổi phải nổ đom đóm. Bởi vậy ai giúp giải quyết được vấn đề này tui sẽ mời đi uống ca fe KOPIKO.

White_Rose
19-01-2003, 01:43
Hic, đổi năm sang năm âm lịch thì hầu như ai cũng làm được. Mình cần là cần đổi ngày kìa :(((

Lighting_dragon
19-01-2003, 01:50
Mời bác White_Rose ra tay.

quaitieutu
19-01-2003, 16:01
Các bạn thử liên hệi với thầy Tăng Vĩnh Tài bên Vovisoft hoặc webmaster của vietshare.com.Hai vị tiền bối này có lẽ đã làm xong cái này rồi.Vấn đề này bên đó đã thấy nói đến từ năm ngoài rồi.Chắc giờ nãy đã có code trong Vb rùi.Chúc thành công

lazy-programmer
20-01-2003, 16:32
Một phương pháp "thực tế" nhất
Tôi đã theo dõi khá nhiều bài viết về cách đổi Âm Lịch - Dương Lịch nhưng không có bài viết nào chi tiết và cụ thể cả. Lùng sục trên Internet thì có tài liệu nghiên cứu về vần đề này nhưng cuối cùng phát hiện ra đây là vấn đề hết sức phức tạp (thậm chí ngay Lịch Trung Quốc cũng còn nhiều tranh cãi). Đa số các chương trình chuyển đổi âm-dương lịch đều tra theo dạng bảng thay vì làm một thuật toán chung. Ngoài ra lịch Việt Nam lại hơi lệch với lịch Trung Quốc (kg rõ lý do lắm).

Vậy nên theo tôi các bạn nên lập một Database list các năm (VD: từ 1900 - 2050 theo cuốn "Lịch Vạn Niên") và mỗi tháng bạn so khớp ngày đầu tháng Dương Lịch với ngày tháng Âm Lịch và từ đó tính ra các ngày khác. Như vậy mỗi năm bạn cần 12 records (ứng với 12 tháng), 150 năm cần 1800 records (kg phải quá nhiều, chỉ cần 2-3 ngày nhập liệu). Và một giải thuật rất đơn giản để tính ra ngày. Bạn cũng có thể thêm các dữ liệu khác vào database ấy như Can-Chi của ngày, tháng... để có một lịch hoàn chỉnh.

Mong các bạn đóng góp thêm. Thanks

baotrung
21-01-2003, 09:02
hi lazy_program

Đúng là bạn lười lập trình nên đề ra phương thức cực khổ
như vậy. input data rồi lookup thì còn nói làm gì?
Anyway thank you.

lazy-programmer
21-01-2003, 11:23
Chà, bạn nói chính xác rồi đó. Đấy là phương châm của mình mà. Cái gì khó quá thì nên đi vòng để đạt tới mục tiêu trước, còn hơn mất thời gian để cuối cùng cứ lẩn quẩn với những giải thuật mà có thể bạn sẽ nhận thấy là "thà theo cách kia còn hơn" (hoặc vì nó quá phức tạp và tốn thời gian, hoặc không thể ứng dụng đc vì quá chậm). Vấn đề là deadline mà bạn đặt ra cho ctrình của mình phải ra đời.

Bạn vào website này:

http://emr.cs.iit.edu/home/reingold/calendar-book/second-edition/index.html

Ở đó có tất cả các nghiên cứu về lịch Chinese, trong đó có một Applet đổi Âm-Dương lịch và nếu bạn xem source code thì bạn cũng thấy họ tra theo dạng bảng vì theo họ giải thuật quá phức tạp. Nếu như những người chuyên nghiên cứu về vấn đề này còn chọn cách tiếp cận như vậy thì chúng ta có nên đi theo con đường khó hơn chăng?

However, nếu bạn tìm được một giải thuật tốt, xin post lên cho mọi người tham khảo. Thanks.

baotrung
21-01-2003, 18:20
Thanks for your link, Lazy_programmer

Mình đã load về cái source code bằng JAVA, xem wa thấy giải thuật wá phức tộp, họ không dùng cách tra bảng đâu, mình post len đây để mọi người cùng ngâm kứu và chuyển ngữ sang VB.

Mong mọi người cộng tác. Tks

mel
21-01-2003, 18:21
lazy-programmer nói hay ghê luôn, đọc mãi không thấy chán.

White_Rose
22-01-2003, 00:03
:) Hình như không có tra bảng thật, Applet thì tra bảng cái gì nữa :D
Để vài hôm nữa WR translate ra VB xem sao. Nếu được thì baotrung nhớ đãi cafe nhá:Dlol

White_Rose
22-01-2003, 05:00
// Referenced classes of package calendars:
// MonthDayYear, AltCalendar, ArrayEnum, Gregorian,
// Moment
//......
public static final long EPOCH = (new Gregorian(2, 15, -2636)).toRD();
//......Hic, thiếu nhiều class thế này thì chịu, chẳng tài nào mà convert được đâu.
Bạn lấy file đó ở đâu thì lấy hết luôn đi. Cái này chỉ là một class trong cả đống class của cái Applet đó thôi.

baotrung
22-01-2003, 08:49
Hi WR

Thật thiếu sót, lấy tiếp gởi cho you đây, muốn convert sang Vb không những phải giỏi Java mà còn tinh thông thiên văn nữa
chúc you thành công, đừng nản chí nhé.

Cafe KOPIKO luôn sẵn sàng chờ

lol

QuynhGiao
24-01-2003, 14:54
Các đồng chí ơi !
Hôm nọ em đọc đc trong 1 quyển gì đấy có nói về cách đủi ÂL->DL
đấy.
Để qua Tết em lên Hn Scan trang đó ru`i post lên đây.
Vụ này em đã đăng ký nghen. Không ai đc tranh đâu nhé.
Ai mời Café nhớ giữ lời nghen..

lazy-programmer
27-01-2003, 17:31
:eek: Thật là một giải thuật kinh khủng... Có thể chuyển sang VB nhưng khó mà hiểu hết được trừ phi bạn theo một khóa về Thiên Văn Học.

Pharaooon
29-01-2003, 21:48
Sao khó thế nhỉ?Sao mọi người không tạo một lịch vạn niên cho âm lịch ,y như trong Win ấy mờ(chỉ ra tháng mấy có mấy ngày...rồi có hàm add chẳng hạn sẽ cộng thêm vào một ngày âm lịch một gia số(ví dụ như 100 ngày)rồi trả về một ngày khác tháng khác (cũng âm lịch luôn,tất nhiên)
Sau đó chỉ đơn giản là chọn một mốc chung cho Âm và Dương lịch chỉ định ngày mấy tháng mấy trong âm lịch trùng với ngày mấy tháng mấy trong dương lịch===>Okie

Nicky
30-01-2003, 16:17
hahhaha
Thôi bỏ đi các bác....:)phải theo học bác Khổng Minh về thuật thiên văn thì may ra, chúng ta cũng không hiểu nó như thế nào thì làm sao viết được....

lazy-programmer
06-02-2003, 09:17
Thôi nghe bàn ra, tán vào chán quá. Mình quyết định bỏ tính lười biếng bẩm sinh để ''động chân, động tay" viết một .dll bằng VB.Net để đổi từ DL-> AL (từ 1900 - 2100). Mình nghĩ cũng đủ cho phần lớn các ứng dụng hiện nay. Ưu điểm của lib này là:

+ Chạy cực nhanh, nhỏ gọn.
+ Có chức năng đổi từ ngày DL-AL theo Can-Chi của năm, tháng, ngày và giờ.
+Có vài hàm hỗ trợ các bạn muốn làm lịch Dương Âm.

Do không có nhiều thời gian nên tôi phải hẹn các bạn 1-2 tuần nữa.

Pharaooon
06-02-2003, 11:26
Người ta đang bàn về đổi AL->DL mà,Đổi dương sang âm có gì là khó chỉ việc chia ra lấy Mod chứ mấy

lazy-programmer
06-02-2003, 11:43
Bạn nên tìm hiểu thêm trước khi bình luận. Nếu mọi chuyện đơn giản như vậy thì các bạn trên diễn đàn này (mà tôi tin là có rất nhiều người giỏi) không phải tốn "giấy mực" nhiều như vậy.

White_Rose
06-02-2003, 11:51
:) Mình cũng đang làm một class như vậy trong C# (vừa mới bắt đầu học mà).

huyle_khongminh
22-12-2005, 17:58
bác nào có code chuyển đổi dương lịch => âm lịch (chuyển ngày tháng DL =>AL chứ không phải là chuyển năm) cho mình xin với.
Mình tìm mãi mà chưa thấy

tumickey
22-12-2005, 18:14
sao kô sài hàng vn chất lượng cao ??
http://www.informatik.uni-leipzig.de/~duc/amlich

huyle_khongminh
22-12-2005, 18:38
cảm ơm tumickey mhưng tiếc quá mình không biết tí gì về JavaScript bạn nào có code vb không

tumickey
22-12-2005, 18:45
bạn có thể coi thuật toán mà làm :) trong đó có hết đó
http://www.informatik.uni-leipzig.de/~duc/amlich/calrules.html
NGoài viết bằng js còn viết bằng java và php nữa :) .

themummy
27-12-2005, 14:45
Quá hay ~ quá khó! :no:

minhpn
04-01-2006, 09:10
Tôi có 01 đoạn về ngày tháng năm âm, dương lịch = VB.NET
Chọn tháng ==> Thứ ; Ngày dương lịch, Ngày âm lịch (Nhâm Thìn chẳng hạn)
Tháng âm lịch (Kỷ Sửu chẳng hạn), Tiết khí.

Bác nào tham khảo mail cho tôi nhé.

thuongall
04-01-2006, 10:35
Bạn tham khảo tại đây: http://www.forum.caulacbovb.com/viewtopic.php?t=1681

Chúc vui!

zigzaglk
07-05-2009, 16:37
Tumickey ơi cho mình hỏi
-mấy cái thông số của hàm chuyển đổi từ dd/mm/yy sang Julius và ngược lại làm sao có được vậy

trieuantontrieu
07-06-2009, 07:25
mình có một giải thuật đổi dương lịch ra âm lịch và ngược lại nhưng lâu qua để đâu không kiếm thấy bữa nào kiếm thấy minh post lên ha

maihuuton
01-03-2010, 23:14
Thật không dể ti nào !
Hic

latdat089
01-11-2013, 10:33
Thanks for your link, Lazy_programmer

Mình đã load về cái source code bằng JAVA, xem wa thấy giải thuật wá phức tộp, họ không dùng cách tra bảng đâu, mình post len đây để mọi người cùng ngâm kứu và chuyển ngữ sang VB.

Mong mọi người cộng tác. Tks
cho em các source code bằng java với

ada95
21-11-2014, 12:09
Chương trình đổi âm - dương lịch bằng VBA
(Nguồn: ?)



'CHUYEN DOI NGAY AM DUONG LICH
'-----------------------------
'Su dung 2 ham:

'1. Ham Solar2Lunar(Day;Month;Year;TimeZone)
'- La ham chuyen doi Duong lich sang Am lich, trong do:
'- Day;Month;Year la ngay thang nam Duong lich
'- TimeZone: gio khu vuc; O Viet Nam thi TimeZone=7

'2. Ham Lunar2Solar(LunarDay;LunarMonth;LunarYear;LunarLea p;TimeZone)
'- La ham chuyen doi am lich sang duong lich, trong do:
'- LunarDay;LunarMonth;LunarYear la ngay thang nam Am lich
'- LunarLeap=0: neu LunarMonth la thang Thuong; Va =1: neu la thang Nhuan
'- TimeZone: gio khu vuc; O Viet Nam thi TimeZone=7

'3. Vi du trong Excel, trong cell:
'=Solar2Lunar(21;11;2014;7) --Ngay 21/11/2014 Duong lich
'Ket qua la: 29/09/2014 AL (9 N) -->Am lich
'=Lunar2Solar(29;9;2014;1;7) --Ngay 29/9/2014 Am lich, thang nhuan
'Ket qua la: 21/11/2014 -->Duong lich


Option Explicit
Const PI As Double = 3.14159265358979 ' Atn(1) * 4


Private Function jdFromDate(ByVal dd As Long, ByVal mm As Long, ByVal yy As Long) As Long
Dim a As Double, y As Long, m As Long, jd As Long
a = Fix((14 - mm) / 12)
y = yy + 4800 - a
m = mm + 12 * a - 3
jd = dd + Fix((153 * m + 2) / 5) + 365 * y _
+ Fix(y / 4) - Fix(y / 100) + Fix(y / 400) - 32045
If jd < 2299161 Then
jd = dd + Fix((153 * m + 2) / 5) + 365 * y + Fix(y / 4) - 32083
End If
jdFromDate = jd
End Function
' Convert a Julian day number to day/month/year. Parameter jd is an integer
Private Function jdToDate(ByVal jd As Long)
Dim a As Long, b As Long, C As Long, d As Long, E As Long, m As Long
Dim Day As Long, Month As Long, Year As Long
If (jd > 2299160) Then ' After 5/10/1582, Gregorian calendar
a = jd + 32044
b = Fix((4 * a + 3) / 146097)
C = a - Fix((b * 146097) / 4)
Else
b = 0
C = jd + 32082
End If
d = Fix((4 * C + 3) / 1461)
E = C - Fix((1461 * d) / 4)
m = Fix((5 * E + 2) / 153)
Day = E - Fix((153 * m + 2) / 5) + 1
Month = m + 3 - 12 * Fix(m / 10)
Year = b * 100 + d - 4800 + Fix(m / 10)
jdToDate = Array(Day, Month, Year)
End Function

' Compute the time of the k-th new moon after the new moon of 1/1/1900 13:52 UCT
' (measured as the number of days since 1/1/4713 BC noon UCT,
' e.g., 2451545.125 is 1/1/2000 15:00 UTC).
' Returns a floating number, e.g.,
' 2415079.9758617813 for k=2 or 2414961.935157746 for k=-2

Private Function NewMoon(ByVal k As Long) As Double
Dim T As Double, T2 As Double, T3 As Double, dr As Double
Dim Jd1 As Double, m As Double, Mpr As Double
Dim f As Double, C1 As Double, deltat As Double, JdNew As Double
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 * 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) * Sin(m * dr) + 0.0021 * Sin(2 * dr * m)
C1 = C1 - 0.4068 * Sin(Mpr * dr) + 0.0161 * Sin(dr * 2 * Mpr)
C1 = C1 - 0.0004 * Sin(dr * 3 * Mpr)
C1 = C1 + 0.0104 * Sin(dr * 2 * f) - 0.0051 * Sin(dr * (m + Mpr))
C1 = C1 - 0.0074 * Sin(dr * (m - Mpr)) + 0.0004 * Sin(dr * (2 * f + m))
C1 = C1 - 0.0004 * Sin(dr * (2 * f - m)) - 0.0006 * Sin(dr * (2 * f + Mpr))
C1 = C1 + 0.001 * Sin(dr * (2 * f - Mpr)) + 0.0005 * 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 = JdNew
End Function

' Compute the longitude of the sun at any time.
' Parameter: floating number jdn, the number of days since 1/1/4713 BC noon

Private Function SunLongitude(ByVal jdn As Double) As Double
Dim T As Double, T2 As Double, dr As Double, m As Double
Dim L0 As Double, DL As Double, l As Double
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) * Sin(dr * m)
DL = DL + (0.019993 - 0.000101 * T) * Sin(dr * 2 * m) _
+ 0.00029 * Sin(dr * 3 * m)
l = L0 + DL ' true longitude, degree
l = l * dr
l = l - PI * 2 * (Fix(l / (PI * 2))) ' Normalize to (0, 2*PI)
SunLongitude = l
End Function

' Compute sun position at midnight of the day with the given Julian day number.
' The time zone if the time difference between local time and UTC: 7.0 for UTC+7:00.
' The function returns a number between 0 and 11.
' From the day after March equinox and the 1st major term after March equinox,
' 0 is returned. After that, return 1, 2, 3 ...
Private Function getSunLongitude(ByVal dayNumber As Double, ByVal timeZone As Byte) As Long
getSunLongitude = Fix(SunLongitude(dayNumber - 0.5 - timeZone / 24) / PI * 6)
End Function

' Compute the day of the k-th new moon in the given time zone.
' The time zone if the time difference between local time and UTC: 7.0 for UTC+7:00
Private Function getNewMoonDay(ByVal k As Long, ByVal timeZone As Long) As Long
getNewMoonDay = Fix(NewMoon(k) + 0.5 + timeZone / 24)
End Function

' Find the day that starts the luner month 11 of the given year
' for the given time zone
Private Function getLunarMonth11(ByVal yy As Long, ByVal timeZone As Long) As Long
Dim k As Long, off As Double, nm As Long, sunLong As Double
'' off = jdFromDate(31, 12, yy) - 2415021.076998695
off = jdFromDate(31, 12, yy) - 2415021
k = Fix(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

' Find the index of the leap month after the month starting on the day a11.
Private Function getLeapMonthOffset(ByVal a11 As Double, ByVal timeZone As Long) As Long
Dim k As Long, last As Long, Arc As Long, i As Long
k = Fix((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)
Do
last = Arc
i = i + 1
Arc = getSunLongitude(getNewMoonDay(k + i, timeZone), timeZone)
Loop While (Arc <> last And i < 14)
getLeapMonthOffset = i - 1
End Function

' Comvert solar date dd/mm/yyyy to the corresponding lunar date
Public Function Solar2Lunar( _
ByVal dd As Long, _
ByVal mm As Long, _
Optional ByVal yy As Long = 0, _
Optional ByVal timeZone As Long = 7) As String
Dim k As Long, diff As Long, leapMonthDiff As Long, dayNumber As Long
Dim monthStart As Double, a11 As Long, b11 As Long
Dim lunarDay As Double, lunarMonth As Long, lunarYear As Long, lunarLeap As Long
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If yy = 0 Then yy = Year(Date)
dayNumber = jdFromDate(dd, mm, yy)
k = Fix((dayNumber - 2415021.07699869) / 29.530588853)
monthStart = getNewMoonDay(k + 1, timeZone)
If (monthStart > dayNumber) Then
monthStart = getNewMoonDay(k, timeZone)
End If
' alert(dayNumber + " -> " + monthStart)
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 = Fix((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
If (lunarMonth > 12) Then lunarMonth = lunarMonth - 12
If (lunarMonth >= 11 And diff < 4) Then lunarYear = lunarYear - 1
Solar2Lunar = Format(lunarDay, "00") & _
"/" & Format(lunarMonth, "00") & _
"/" & Format(lunarYear, "0000 \A\L") & IIf(lunarLeap, " (" & lunarMonth & " N)", "")
End Function

' Convert a lunar date to the corresponding solar date
Public Function Lunar2Solar( _
ByVal lunarDay As Long, _
ByVal lunarMonth As Long, _
Optional ByVal lunarYear As Long = 0, _
Optional ByVal lunarLeap As Long = 0, _
Optional ByVal timeZone As Long = 7) As Date
Dim k As Long, a11 As Long, b11 As Long, off As Long, leapOff As Long
Dim LeapMonth As Long, monthStart As Long
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If lunarYear = 0 Then lunarYear = Year(Date)
If (lunarMonth < 11) Then
a11 = getLunarMonth11(lunarYear - 1, timeZone)
b11 = getLunarMonth11(lunarYear, timeZone)
Else
a11 = getLunarMonth11(lunarYear, timeZone)
b11 = getLunarMonth11(lunarYear + 1, timeZone)
End If
k = Fix(0.5 + (a11 - 2415021.07699869) / 29.530588853)
off = lunarMonth - 11
If (off < 0) Then off = off + 12
If (b11 - a11 > 365) Then
leapOff = getLeapMonthOffset(a11, timeZone)
LeapMonth = leapOff - 2
If (LeapMonth < 0) Then LeapMonth = LeapMonth + 12
If (lunarLeap <> 0 And lunarMonth <> LeapMonth) Then
Lunar2Solar = Array(0, 0, 0)
Exit Function
ElseIf (lunarLeap <> 0 Or off >= leapOff) Then
off = off + 1
End If
End If
monthStart = getNewMoonDay(k + off, timeZone)
Dim R
R = jdToDate(monthStart + lunarDay - 1)
Lunar2Solar = DateSerial(R(2), R(1), R(0))
End Function