设:公元年数-1977(或1901)=4Q+R
则:阴历日期=14Q+10.6(R+1)+年内日期序数-29.5n
(注:式中Q、R、n均为自然数,R<4)
例:1994年5月7日的阴历日期为:
1994-1977=17=4×4+1
故:Q=4,R=1 则:5月7日的阴历日期为:
14×4+10.6(1+1)+(31+28+31+30+7)-29.5n
=204.2- 29.5n
然后用29.5去除204.2得商数6......27.2,6即是n值,余数27即是阴历二十七日。
给你个农历的VB源码.curTime = MaskEdBox1
'星期名
WeekName(0) = " * "
WeekName(1) = "星期日"
WeekName(2) = "星期一"
WeekName(3) = "星期二"
WeekName(4) = "星期三"
WeekName(5) = "星期四"
WeekName(6) = "星期五"
WeekName(7) = "星期六"
'天干名称
TianGan(0) = "甲"
TianGan(1) = "乙"
TianGan(2) = "丙"
TianGan(3) = "丁"
TianGan(4) = "戊"
TianGan(5) = "己"
TianGan(6) = "庚"
TianGan(7) = "辛"
TianGan(8) = "壬"
TianGan(9) = "癸"
'地支名称
DiZhi(0) = "子"
DiZhi(1) = "丑"
DiZhi(2) = "寅"
DiZhi(3) = "卯"
DiZhi(4) = "辰"
DiZhi(5) = "巳"
DiZhi(6) = "午"
DiZhi(7) = "未"
DiZhi(8) = "申"
DiZhi(9) = "酉"
DiZhi(10) = "戌"
DiZhi(11) = "亥"
'属相名称
ShuXiang(0) = "鼠"
ShuXiang(1) = "牛"
ShuXiang(2) = "虎"
ShuXiang(3) = "兔"
ShuXiang(4) = "龙"
ShuXiang(5) = "蛇"
ShuXiang(6) = "马"
ShuXiang(7) = "羊"
ShuXiang(8) = "猴"
ShuXiang(9) = "鸡"
ShuXiang(10) = "狗"
ShuXiang(11) = "猪"
'农历日期名
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) = "三十"
'农历月份名
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) = "腊"
'公历每月前面的天数
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
'农历数据
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
'生成当前公历年、月、日 ==>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
'生成当前公历星期 ==>WeekdayStr
curWeekday = Weekday(curTime)
WeekdayStr = WeekName(curWeekday)
'计算到初始时间1921年2月8日的天数:1921-2-8(正月初一)
TheDate = (curYear - 1921) * 365 + Int((curYear - 1921) / 4) + curDay + MonthAdd(curMonth - 1) - 38
If curYear Mod 4 = 0 And curMonth >2 Then
TheDate = TheDate + 1
End If
'计算农历天干、地支、月、日
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个二进制位的值
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
'生成农历天干、地支、属相 ==>NongliStr
NongliStr = "农历" &TianGan(((curYear - 4) Mod 60) Mod 10) &DiZhi(((curYear - 4) Mod 60) Mod 12) &"年"
NongliStr = NongliStr &"(" &ShuXiang(((curYear - 4) Mod 60) Mod 12) &")"
'生成农历月、日 ==>NongliDayStr
If curMonth <1 Then
NongliDayStr = "闰" &MonName(-1 * curMonth)
Else
NongliDayStr = MonName(curMonth)
End If
NongliDayStr = NongliDayStr &"月"
NongliDayStr = NongliDayStr &DayName(curDay)
Label2 = NongliStr &NongliDayStr
function RunGLNL(){ var today=new Date()var d=new Array("星期日","星期一","星期二","星期三","星期四","星期五","星期六")var DDDD=(today.getYear()<100 ? today.getYear()+1900:today.getYear())+"年"+(today.getMonth()+1)+"月"+today.getDate()+"日"DDDD = DDDD + " " + d[today.getDay()]DDDD = DDDD+ " " + (CnDateofDateStr(today))//DDDD = DDDD+ " " + SolarTerm(today)document.write(DDDD)} function DaysNumberofDate(DateGL){ return parseInt((Date.parse(DateGL)-Date.parse(DateGL.getYear()+"/1/1"))/86400000)+1} function CnDateofDate(DateGL){ var CnData=new Array( 0x16,0x2a,0xda,0x00,0x83,0x49,0xb6,0x05,0x0e,0x64,0xbb,0x00,0x19,0xb2,0x5b,0x00, 0x87,0x6a,0x57,0x04,0x12,0x75,0x2b,0x00,0x1d,0xb6,0x95,0x00,0x8a,0xad,0x55,0x02, 0x15,0x55,0xaa,0x00,0x82,0x55,0x6c,0x07,0x0d,0xc9,0x76,0x00,0x17,0x64,0xb7,0x00, 0x86,0xe4,0xae,0x05,0x11,0xea,0x56,0x00,0x1b,0x6d,0x2a,0x00,0x88,0x5a,0xaa,0x04, 0x14,0xad,0x55,0x00,0x81,0xaa,0xd5,0x09,0x0b,0x52,0xea,0x00,0x16,0xa9,0x6d,0x00, 0x84,0xa9,0x5d,0x06,0x0f,0xd4,0xae,0x00,0x1a,0xea,0x4d,0x00,0x87,0xba,0x55,0x04 )var CnMonth=new Array()var CnMonthDays=new Array()var CnBeginDayvar LeapMonthvar Bytes=new Array()var Ivar CnMonthDatavar DaysCountvar CnDaysCountvar ResultMonthvar ResultDayvar yyyy=DateGL.getYear()var mm=DateGL.getMonth()+1var dd=DateGL.getDate()if(yyyy<100) yyyy+=1900if ((yyyy <1997) || (yyyy >2020)){ return 0} Bytes[0] = CnData[(yyyy - 1997) * 4]Bytes[1] = CnData[(yyyy - 1997) * 4 + 1]Bytes[2] = CnData[(yyyy - 1997) * 4 + 2]Bytes[3] = CnData[(yyyy - 1997) * 4 + 3]if ((Bytes[0] &0x80) != 0) {CnMonth[0] = 12} else {CnMonth[0] = 11} CnBeginDay = (Bytes[0] &0x7f)CnMonthData = Bytes[1]CnMonthData = CnMonthData <<8CnMonthData = CnMonthData | Bytes[2]LeapMonth = Bytes[3]for (I=15I>=0I--){ CnMonthDays[15 - I] = 29if (((1 <<I) &CnMonthData) != 0 ){ CnMonthDays[15 - I]++} if (CnMonth[15 - I] == LeapMonth ){ CnMonth[15 - I + 1] = - LeapMonth} else{ if (CnMonth[15 - I] <0 ){CnMonth[15 - I + 1] = - CnMonth[15 - I] + 1} else {CnMonth[15 - I + 1] = CnMonth[15 - I] + 1} if (CnMonth[15 - I + 1] >12 ){ CnMonth[15 - I + 1] = 1} } } DaysCount = DaysNumberofDate(DateGL) - 1if (DaysCount <= (CnMonthDays[0] - CnBeginDay)){ if ((yyyy >1901) &&(CnDateofDate(new Date((yyyy - 1)+"/12/31")) <0)){ ResultMonth = - CnMonth[0]} else {ResultMonth = CnMonth[0]} ResultDay = CnBeginDay + DaysCount} else{ CnDaysCount = CnMonthDays[0] - CnBeginDayI = 1while ((CnDaysCount <DaysCount) &&(CnDaysCount + CnMonthDays[I] <DaysCount)){ CnDaysCount+= CnMonthDays[I]I++} ResultMonth = CnMonth[I]ResultDay = DaysCount - CnDaysCount} if (ResultMonth >0){ return ResultMonth * 100 + ResultDay} else{return ResultMonth * 100 - ResultDay} } function CnYearofDate(DateGL){ var YYYY=DateGL.getYear()var MM=DateGL.getMonth()+1var CnMM=parseInt(Math.abs(CnDateofDate(DateGL))/100)if(YYYY<100) YYYY+=1900if(CnMM>MM) YYYY--YYYY-=1864return CnEra(YYYY)+"年"} function CnMonthofDate(DateGL){ var CnMonthStr=new Array("零","正","二","三","四","五","六","七","八","九","十","十一","腊")var MonthMonth = parseInt(CnDateofDate(DateGL)/100)if (Month <0){return "闰" + CnMonthStr[-Month] + "月"} else{return CnMonthStr[Month] + "月"} } function CnDayofDate(DateGL){ var CnDayStr=new Array("零", "初一", "初二", "初三", "初四", "初五", "初六", "初七", "初八", "初九", "初十", "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十", "廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "三十")var DayDay = (Math.abs(CnDateofDate(DateGL)))%100return CnDayStr[Day]} function DaysNumberofMonth(DateGL){ var MM1=DateGL.getYear()MM1<100 ? MM1+=1900:MM1var MM2=MM1MM1+="/"+(DateGL.getMonth()+1)MM2+="/"+(DateGL.getMonth()+2)MM1+="/1"MM2+="/1"return parseInt((Date.parse(MM2)-Date.parse(MM1))/86400000)} function CnEra(YYYY){ var Tiangan=new Array("甲","乙","丙","丁","戊","己","庚","辛","壬","癸")//var Dizhi=new Array("子(鼠)","丑(牛)","寅(虎)","卯(兔)","辰(龙)","巳(蛇)", //"午(马)","未(羊)","申(猴)","酉(鸡)","戌(狗)","亥(猪)")var Dizhi=new Array("子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥")return Tiangan[YYYY%10]+Dizhi[YYYY%12]} function CnDateofDateStr(DateGL){ if(CnMonthofDate(DateGL)=="零月") return " 请调整您的计算机日期!"else return "农历:"+CnYearofDate(DateGL)+ " " + CnMonthofDate(DateGL) + CnDayofDate(DateGL)} function SolarTerm(DateGL){ var SolarTermStr=new Array( "小寒","大寒","立春","雨水","惊蛰","春分", "清明","谷雨","立夏","小满","芒种","夏至", "小暑","大暑","立秋","处暑","白露","秋分", "寒露","霜降","立冬","小雪","大雪","冬至")var DifferenceInMonth=new Array( 1272060,1275495,1281180,1289445,1299225,1310355, 1321560,1333035,1342770,1350855,1356420,1359045, 1358580,1355055,1348695,1340040,1329630,1318455, 1306935,1297380,1286865,1277730,1274550,1271556)var DifferenceInYear=31556926var BeginTime=new Date(1901/1/1)BeginTime.setTime(947120460000)for(DateGL.getYear()<BeginTime.getYear()){ BeginTime.setTime(BeginTime.getTime()-DifferenceInYear*1000)} for(DateGL.getYear()>BeginTime.getYear()){ BeginTime.setTime(BeginTime.getTime()+DifferenceInYear*1000)} for(var M=0DateGL.getMonth()>BeginTime.getMonth()M++){ BeginTime.setTime(BeginTime.getTime()+DifferenceInMonth[M]*1000)} if(DateGL.getDate()>BeginTime.getDate()){ BeginTime.setTime(BeginTime.getTime()+DifferenceInMonth[M]*1000)M++} if(DateGL.getDate()>BeginTime.getDate()){ BeginTime.setTime(BeginTime.getTime()+DifferenceInMonth[M]*1000)M==23?M=0:M++} var JQif(DateGL.getDate()==BeginTime.getDate()){ JQ=" 今天是<font color='#FF9999'><b>"+SolarTermStr[M] + "</b></font>"} else if(DateGL.getDate()==BeginTime.getDate()-1){ JQ=" 明天是<font color='#FF9999'><b>"+SolarTermStr[M] + "</b></font>"} else if(DateGL.getDate()==BeginTime.getDate()-2){ JQ=" 后天是<font color='#FF9999'><b>"+SolarTermStr[M] + "</b></font>"} else{ JQ=" " if(DateGL.getMonth()==BeginTime.getMonth()){ JQ+=" 本月"} else{ JQ+=" 下月"} JQ+=BeginTime.getDate()+"日"+"<font color='#FF9999'><b>"+SolarTermStr[M]+"</b></font>"} return JQ} function CAL() {} RunGLNL() 详细出处参考: http://www.jb51.net/article/17021.htm