javascript阳历转阴历方法?

JavaScript019

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即是阴历二十七日。

阳历和阴历之间是不能换算的,二者采用的计算方法不同,没有特殊关系可以查询,只能分别计算。

太阳历,又称为阳历,是以地球绕太阳公转的运动周期为基础而制定的历法。太阳历的历年近似等于回归年,一年12个月,这个“月”,实际上与朔望月无关。

阳历的月份、日期都与太阳在黄道上的位置较好地符合,根据阳历的日期,在一年中可以明显看出四季寒暖变化的情况;但在每个月份中,看不出月亮的朔、望、两弦。

阴历,中国传统历法之一,也被称为旧历、汉历、古历等,辛亥革命后改用西方太阳历(公历),而近现代使用的农历属于阴阳合历,也就是阴历和阳历的合历。

阴历,其计算方法是:

以太阴圆缺一周为一月,历时29日12小时44分2.8秒,太阴圆缺十二周为一年,历时354日8小时48分33.6秒。每一年的12个月中,6个单数月份(即1、3、5、7、9、11月)为“大建”,每月为30天。

6个双数月份(2、4、6、8、10、12月)为“小建”,每月为29天;在逢闰之年,将12月改大月为30天。该历以30年为一周期,每一周期里的第2、5、7、10、13、16、18、21、24、26、29年,共11年为闰年, 不设置闰月,而在12月末置一闰日,闰年为355日,另19年为平年,每年354日。

故平均每年为354日8小时48分。按该历全年实际天数计算,比回归年约少10日21小时1分,积2.7回归年相差一月,积32.6回归年相差一年。该历对昼夜的计算,以日落为一天之始,到次日日落为一日,通常称为夜行前,即黑夜在前,白昼在后,构成一天。