有谁知道js的农历算法是怎么写出来的

JavaScript013

有谁知道js的农历算法是怎么写出来的,第1张

其实我也不懂这个算法,网上粘贴的,我觉得可以不去深究这个公式,反正有现成代码:

设:公元年数-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