根據(jù)經(jīng)驗(yàn), 這個(gè)算法非常復(fù)雜. 經(jīng)過(guò)查找,終于得到一些資料, 在此愿與大家分享。 首先陰歷以月為基本單位,一個(gè)月以新月出現(xiàn)的那一天為始直至下一個(gè)新月出現(xiàn)的前一天。 由于月亮公轉(zhuǎn)的周期介于29到30天之間,陰歷的一個(gè)月也就由新月出現(xiàn)時(shí)刻的早晚或是29天或是30天。 大月為30天,小月為29天。 與陽(yáng)歷不同的是,大小月在不同的年中不固定。 如春節(jié)的前一天常稱(chēng)為大年三十,但有不少年如2000年的陰歷十二月只有29天。 由于十二個(gè)月的時(shí)間較陽(yáng)歷年即地球繞太陽(yáng)公轉(zhuǎn)一周的時(shí)間短11天左右. 為了使陰歷年與陽(yáng)歷年保持相對(duì)穩(wěn)定,每隔兩三年就需要加入一個(gè)閏月。 大約每十九年要加入七個(gè)閏月。 而二十四節(jié)氣則是由地球在繞太陽(yáng)公轉(zhuǎn)的軌道上的位置確定的。 以每年的冬至為始,每15度為一個(gè)節(jié)氣。 是故二十四節(jié)氣在陽(yáng)歷的每月中有大概固定的日期。 古時(shí)以二十四節(jié)氣指導(dǎo)農(nóng)耕,這就是陰歷又稱(chēng)農(nóng)歷的原因。 其中陽(yáng)歷下半月的十二個(gè)節(jié)氣又稱(chēng)為中氣。 中氣出現(xiàn)的時(shí)刻和閏月的確定有直接的關(guān)系。 陰歷的計(jì)算有下列四條規(guī)則: 1.所有新月和節(jié)氣出現(xiàn)的時(shí)刻的計(jì)算以東經(jīng)120度即東八區(qū)標(biāo)準(zhǔn)時(shí)為準(zhǔn)。 但計(jì)算1929年以前的陰歷時(shí)應(yīng)以北京即東經(jīng)116度25分的當(dāng)?shù)貢r(shí)為準(zhǔn)。 2.新月出現(xiàn)的一天為一個(gè)月的第一天。 如某個(gè)節(jié)氣的出現(xiàn)時(shí)刻也在這一天,則不論該節(jié)氣的出現(xiàn)時(shí)刻是否比新月晚,一律算落入新的一個(gè)月中。 3.每年的冬至總是落在這年的十一月中。 從一年的冬至的第二天起到下一年冬至這一天止的這段時(shí)間稱(chēng)為一歲。 如一歲中有十三個(gè)新月出現(xiàn),則這一歲為閏歲,要加入一個(gè)閏月。 4.閏歲中第一個(gè)沒(méi)有中氣的月為閏月。 因?yàn)橐粴q中只有十二個(gè)中氣,所以閏歲中至少有一個(gè)月沒(méi)有中氣,也存在有兩個(gè)月沒(méi)有中氣的可能性。 但這種情況下只有第一個(gè)沒(méi)有中氣的月為閏月。 閏月的前一個(gè)月為幾月則該閏月稱(chēng)為閏幾月。 根據(jù)以上信息, 我們知道農(nóng)歷是根據(jù)天文觀(guān)測(cè)進(jìn)行指定的(也許可以在天文學(xué)的書(shū)上找到說(shuō)明)。 為了簡(jiǎn)化轉(zhuǎn)換計(jì)算, 很多程序人員設(shè)計(jì)了基于"時(shí)間段內(nèi)查表"方法的例程. 更具體的說(shuō)明和源碼請(qǐng)參考下面這些資料:
我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、平泉ssl等。為1000多家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢(xún)和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的平泉網(wǎng)站制作公司
Option Explicit
Dim WeekName(7), MonthAdd(11), NongliData(99), TianGan(9), DiZhi(11), ShuXia
ng(11), DayName(30), MonName(12)
Dim curTime, curYear, curMonth, curDay, curWeekday
Dim GongliStr, WeekdayStr, NongliStr, NongliDayStr
Dim i, m, n, k, isEnd, bit, TheDate
Private Sub Form_Load()
'獲取當(dāng)前系統(tǒng)時(shí)間
curTime = Now()
'星期名
WeekName(0) = " * "
WeekName(1) = "星期日"
WeekName(2) = "星期一"
WeekName(3) = "星期二"
WeekName(4) = "星期三"
WeekName(5) = "星期四"
WeekName(6) = "星期五"
WeekName(7) = "星期六"
'天干名稱(chēng)
TianGan(0) = "甲"
TianGan(1) = "乙"
TianGan(2) = "丙"
TianGan(3) = "丁"
TianGan(4) = "戊"
TianGan(5) = "己"
TianGan(6) = "庚"
TianGan(7) = "辛"
TianGan(8) = "壬"
TianGan(9) = "癸"
'地支名稱(chēng)
DiZhi(0) = "子"
DiZhi(1) = "丑"
DiZhi(2) = "寅"
DiZhi(3) = "卯"
DiZhi(4) = "辰"
DiZhi(5) = "巳"
DiZhi(6) = "午"
DiZhi(7) = "未"
DiZhi(8) = "申"
DiZhi(9) = "酉"
DiZhi(10) = "戌"
DiZhi(11) = "亥"
'屬相名稱(chēng)
ShuXiang(0) = "鼠"
ShuXiang(1) = "牛"
ShuXiang(2) = "虎"
ShuXiang(3) = "兔"
ShuXiang(4) = "龍"
ShuXiang(5) = "蛇"
ShuXiang(6) = "馬"
ShuXiang(7) = "羊"
ShuXiang(8) = "猴"
ShuXiang(9) = "雞"
ShuXiang(10) = "狗"
ShuXiang(11) = "豬"
'農(nóng)歷日期名
DayName(0) = "*"
DayName(1) = "初一"
DayName(2) = "初二"
DayName(3) = "初三"
DayName(4) = "初四"
DayName(5) = "初五"
DayName(6) = "初六"
DayName(7) = "初七"
DayName(8) = "初八"
DayName(9) = "初九"
DayName(10) = "初十"
DayName(11) = "十一"
DayName(12) = "十二"
DayName(13) = "十三"
DayName(14) = "十四"
DayName(15) = "十五"
DayName(16) = "十六"
DayName(17) = "十七"
DayName(18) = "十八"
DayName(19) = "十九"
DayName(20) = "二十"
DayName(21) = "廿一"
DayName(22) = "廿二"
DayName(23) = "廿三"
DayName(24) = "廿四"
DayName(25) = "廿五"
DayName(26) = "廿六"
DayName(27) = "廿七"
DayName(28) = "廿八"
DayName(29) = "廿九"
DayName(30) = "三十"
'農(nóng)歷月份名
MonName(0) = "*"
MonName(1) = "正"
MonName(2) = "二"
MonName(3) = "三"
MonName(4) = "四"
MonName(5) = "五"
MonName(6) = "六"
MonName(7) = "七"
MonName(8) = "八"
MonName(9) = "九"
MonName(10) = "十"
MonName(11) = "十一"
MonName(12) = "臘"
'公歷每月前面的天數(shù)
MonthAdd(0) = 0
MonthAdd(1) = 31
MonthAdd(2) = 59
MonthAdd(3) = 90
MonthAdd(4) = 120
MonthAdd(5) = 151
MonthAdd(6) = 181
MonthAdd(7) = 212
MonthAdd(8) = 243
MonthAdd(9) = 273
MonthAdd(10) = 304
MonthAdd(11) = 334
'農(nóng)歷數(shù)據(jù)
NongliData(0) = 2635
NongliData(1) = 333387
NongliData(2) = 1701
NongliData(3) = 1748
NongliData(4) = 267701
NongliData(5) = 694
NongliData(6) = 2391
NongliData(7) = 133423
NongliData(8) = 1175
NongliData(9) = 396438
NongliData(10) = 3402
NongliData(11) = 3749
NongliData(12) = 331177
NongliData(13) = 1453
NongliData(14) = 694
NongliData(15) = 201326
NongliData(16) = 2350
NongliData(17) = 465197
NongliData(18) = 3221
NongliData(19) = 3402
NongliData(20) = 400202
NongliData(21) = 2901
NongliData(22) = 1386
NongliData(23) = 267611
NongliData(24) = 605
NongliData(25) = 2349
NongliData(26) = 137515
NongliData(27) = 2709
NongliData(28) = 464533
NongliData(29) = 1738
NongliData(30) = 2901
NongliData(31) = 330421
NongliData(32) = 1242
NongliData(33) = 2651
NongliData(34) = 199255
NongliData(35) = 1323
NongliData(36) = 529706
NongliData(37) = 3733
NongliData(38) = 1706
NongliData(39) = 398762
NongliData(40) = 2741
NongliData(41) = 1206
NongliData(42) = 267438
NongliData(43) = 2647
NongliData(44) = 1318
NongliData(45) = 204070
NongliData(46) = 3477
NongliData(47) = 461653
NongliData(48) = 1386
NongliData(49) = 2413
NongliData(50) = 330077
NongliData(51) = 1197
NongliData(52) = 2637
NongliData(53) = 268877
NongliData(54) = 3365
NongliData(55) = 531109
NongliData(56) = 2900
NongliData(57) = 2922
NongliData(58) = 398042
NongliData(59) = 2395
NongliData(60) = 1179
NongliData(61) = 267415
NongliData(62) = 2635
NongliData(63) = 661067
NongliData(64) = 1701
NongliData(65) = 1748
NongliData(66) = 398772
NongliData(67) = 2742
NongliData(68) = 2391
NongliData(69) = 330031
NongliData(70) = 1175
NongliData(71) = 1611
NongliData(72) = 200010
NongliData(73) = 3749
NongliData(74) = 527717
NongliData(75) = 1452
NongliData(76) = 2742
NongliData(77) = 332397
NongliData(78) = 2350
NongliData(79) = 3222
NongliData(80) = 268949
NongliData(81) = 3402
NongliData(82) = 3493
NongliData(83) = 133973
NongliData(84) = 1386
NongliData(85) = 464219
NongliData(86) = 605
NongliData(87) = 2349
NongliData(88) = 334123
NongliData(89) = 2709
NongliData(90) = 2890
NongliData(91) = 267946
NongliData(92) = 2773
NongliData(93) = 592565
NongliData(94) = 1210
NongliData(95) = 2651
NongliData(96) = 395863
NongliData(97) = 1323
NongliData(98) = 2707
NongliData(99) = 265877
'生成當(dāng)前公歷年、月、日 == GongliStr
curYear = Year(curTime)
curMonth = Month(curTime)
curDay = Day(curTime)
GongliStr = curYear "年"
If (curMonth 10) Then
GongliStr = GongliStr "0" curMonth "月"
Else
GongliStr = GongliStr curMonth "月"
End If
If (curDay 10) Then
GongliStr = GongliStr "0" curDay "日"
Else
GongliStr = GongliStr curDay "日"
End If
'生成當(dāng)前公歷星期 == WeekdayStr
curWeekday = Weekday(curTime)
WeekdayStr = WeekName(curWeekday)
'計(jì)算到初始時(shí)間1921年2月8日的天數(shù):1921-2-8(正月初一)
TheDate = (curYear - 1921) * 365 + Int((curYear - 1921) / 4) + curDay + Mont
hAdd(curMonth - 1) - 38
If ((curYear Mod 4) = 0 And curMonth 2) Then
TheDate = TheDate + 1
End If
'計(jì)算農(nóng)歷天干、地支、月、日
isEnd = 0
m = 0
Do
If (NongliData(m) 4095) Then
k = 11
Else
k = 12
End If
n = k
Do
If (n 0) Then
Exit Do
End If
'獲取NongliData(m)的第n個(gè)二進(jìn)制位的值
bit = NongliData(m)
For i = 1 To n Step 1
bit = Int(bit / 2)
Next
bit = bit Mod 2
If (TheDate = 29 + bit) Then
isEnd = 1
Exit Do
End If
TheDate = TheDate - 29 - bit
n = n - 1
Loop
If (isEnd = 1) Then
Exit Do
End If
m = m + 1
Loop
curYear = 1921 + m
curMonth = k - n + 1
curDay = TheDate
If (k = 12) Then
If (curMonth = (Int(NongliData(m) / 65536) + 1)) Then
curMonth = 1 - curMonth
ElseIf (curMonth (Int(NongliData(m) / 65536) + 1)) Then
curMonth = curMonth - 1
End If
End If
'生成農(nóng)歷天干、地支、屬相 == NongliStr
NongliStr = "農(nóng)歷" TianGan(((curYear - 4) Mod 60) Mod 10) DiZhi(((curYea
r - 4) Mod 60) Mod 12) "年"
NongliStr = NongliStr "(" ShuXiang(((curYear - 4) Mod 60) Mod 12) ")"
'生成農(nóng)歷月、日 == NongliDayStr
If (curMonth 1) Then
NongliDayStr = "閏" MonName(-1 * curMonth)
Else
NongliDayStr = MonName(curMonth)
End If
NongliDayStr = NongliDayStr "月"
NongliDayStr = NongliDayStr DayName(curDay)
MsgBox NongliStr NongliDayStr
End Sub
不是 有 函數(shù)嘛?
now() 就是 吧
取得 后 再 分離出你所需的,分別賦值 就行了,當(dāng)然 還是 有 函數(shù)的