javascript阳历转阴历方法?

JavaScript07

javascript阳历转阴历方法?,第1张

我这里刚好有这个算法代码,请看:

var LunarDate = {  

madd: new Array(0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334),  

HsString: '甲乙丙丁戊己庚辛壬癸',  

EbString: '子丑寅卯辰巳午未申酉戌亥',  

NumString: "一二三四五六七八九十",  

MonString: "正二三四五六七八九十冬腊",  

CalendarData: new Array(0xA4B, 0x5164B, 0x6A5, 0x6D4, 0x415B5, 0x2B6, 0x957, 0x2092F, 0x497, 0x60C96, 0xD4A, 0xEA5, 0x50DA9, 0x5AD, 0x2B6, 0x3126E, 0x92E, 0x7192D, 0xC95, 0xD4A, 0x61B4A, 0xB55, 0x56A, 0x4155B, 0x25D, 0x92D, 0x2192B, 0xA95, 0x71695, 0x6CA, 0xB55, 0x50AB5, 0x4DA, 0xA5B, 0x30A57, 0x52B, 0x8152A, 0xE95, 0x6AA, 0x615AA, 0xAB5, 0x4B6, 0x414AE, 0xA57, 0x526, 0x31D26, 0xD95, 0x70B55, 0x56A, 0x96D, 0x5095D, 0x4AD, 0xA4D, 0x41A4D, 0xD25, 0x81AA5, 0xB54, 0xB6A, 0x612DA, 0x95B, 0x49B, 0x41497, 0xA4B, 0xA164B, 0x6A5, 0x6D4, 0x615B4, 0xAB6, 0x957, 0x5092F, 0x497, 0x64B, 0x30D4A, 0xEA5, 0x80D65, 0x5AC, 0xAB6, 0x5126D, 0x92E, 0xC96, 0x41A95, 0xD4A, 0xDA5, 0x20B55, 0x56A, 0x7155B, 0x25D, 0x92D, 0x5192B, 0xA95, 0xB4A, 0x416AA, 0xAD5, 0x90AB5, 0x4BA, 0xA5B, 0x60A57, 0x52B, 0xA93, 0x40E95),  

Year: null,  

Month: null,  

Day: null,  

TheDate: null,  

GetBit: function(m, n){  

return (m >> n) & 1  

},  

e2c: function(){  

this.TheDate = (arguments.length != 3) ? new Date(): new Date(arguments[0], arguments[1], arguments[2])  

var total, m, n, k  

var isEnd = false  

var tmp = this.TheDate.getFullYear()  

total = (tmp - 1921) * 365 + Math.floor((tmp - 1921) / 4) + this.madd[this.TheDate.getMonth()] + this.TheDate.getDate() - 38  

if (this.TheDate.getYear() % 4 == 0 && this.TheDate.getMonth() > 1) {  

total++  

}  

for (m = 0  m++) {  

k = (this.CalendarData[m] < 0xfff) ? 11: 12  

for (n = k n >= 0 n--) {  

if (total <= 29 + this.GetBit(this.CalendarData[m], n)) {  

isEnd = true  

break  

}  

total = total - 29 - this.GetBit(this.CalendarData[m], n)  

}  

if (isEnd)  

break  

}  

this.Year = 1921 + m  

this.Month = k - n + 1  

this.Day = total  

if (k == 12) {  

if (this.Month == Math.floor(this.CalendarData[m] / 0x10000) + 1) {  

this.Month = 1 - this.Month  

}  

if (this.Month > Math.floor(this.CalendarData[m] / 0x10000) + 1) {  

this.Month--  

}  

}  

},  

GetcDateString: function(){  

var tmp = ""  

tmp += this.HsString.charAt((this.Year - 4) % 10)  

tmp += this.EbString.charAt((this.Year - 4) % 12)  

tmp += "年 "  

if (this.Month < 1) {  

tmp += "(闰)"  

tmp += this.MonString.charAt(-this.Month - 1)  

} else {  

tmp += this.MonString.charAt(this.Month - 1)  

}  

tmp += "月"  

tmp += (this.Day < 11) ? "初": ((this.Day < 20) ? "十": ((this.Day < 30) ? "廿": "三十"))  

if (this.Day % 10 != 0 || this.Day == 10) {  

tmp += this.NumString.charAt((this.Day - 1) % 10)  

}  

return tmp  

},  

GetLunarDay: function(solarYear, solarMonth, solarDay) {  

if (solarYear < 1921 || solarYear > 2020) {  

return ""  

} else {  

solarMonth = (parseInt(solarMonth) > 0) ? (solarMonth - 1): 11  

this.e2c(solarYear, solarMonth, solarDay)  

return this.GetcDateString()  

}  

}  

}

调用代码示例:

window.onload = function(){

document.write('2014-04-01 农历'+LunarDate.GetLunarDay(2014, 4, 1))

}

结果输出:

2014-04-01 农历甲午年 三月初二

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

设:公元年数-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即是阴历二十七日。

公历转农历,如图例:

B2="农历"&TEXT(A2,"[$-130000]m月d日")----限2007版以上

农历闰月月份会加 1,如润7月会显示8月,8月顺延为9月….,12月顺延为13月。

农历转公历:(供参考,不一定正确,闰年无法转换)

B2=LOOKUP(--SUBSTITUTE(SUBSTITUTE(A2,-30,-28),-29,-27),--TEXT((LEFT(A2,5)&"1/1")+ROW($1:$400),"[$-130000]yyyy/m/d"),(LEFT(A2,5)&"1/1")+ROW($1:$400))+(--RIGHT(A2,2)>28)*2

验算:C2="农历"&TEXT(B2,"[$-130000]m月d日")