JavaScript實(shí)現(xiàn)公歷轉(zhuǎn)農(nóng)歷功能示例
本文實(shí)例講述了JavaScript實(shí)現(xiàn)公歷轉(zhuǎn)農(nóng)歷功能。分享給大家供大家參考,具體如下:
完整代碼(該源碼使用在線工具http://tools.jb51.net/code/js進(jìn)行了格式化處理,以便于讀者閱讀):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>公歷轉(zhuǎn)農(nóng)歷</title> <script type="text/javascript" language="javascript" > var CalendarData = new Array(20); var madd = new Array(12); var TheDate; var tgString = "甲乙丙丁戊己庚辛壬癸"; var dzString = "子丑寅卯辰巳午未申酉戌亥"; var numString = "一二三四五六七八九十"; var monString = "正二三四五六七八九十冬臘"; var weekString = "日一二三四五六"; var sx = "鼠?;⑼谬埳唏R羊猴雞狗豬"; var cYear; var cMonth; var cDay; var cHour; var cDateString; var DateString; var Browser = navigator.appName; function init() { CalendarData[0] = 0x41A95; //公元2001年; CalendarData[1] = 0xD4A; CalendarData[2] = 0xDA5; CalendarData[3] = 0x20B55; CalendarData[4] = 0x56A; CalendarData[5] = 0x7155B; CalendarData[6] = 0x25D; CalendarData[7] = 0x92D; CalendarData[8] = 0x5192B; CalendarData[9] = 0xA95; CalendarData[10] = 0xB4A; CalendarData[11] = 0x416AA; CalendarData[12] = 0xAD5; CalendarData[13] = 0x90AB5; CalendarData[14] = 0x4BA; CalendarData[15] = 0xA5B; CalendarData[16] = 0x60A57; CalendarData[17] = 0x52B; CalendarData[18] = 0xA93; CalendarData[19] = 0x40E95; madd[0] = 0; madd[1] = 31; madd[2] = 59; madd[3] = 90; madd[4] = 120; madd[5] = 151; madd[6] = 181; madd[7] = 212; madd[8] = 243; madd[9] = 273; madd[10] = 304; madd[11] = 334; //今年某月已過(guò)天數(shù)! } function GetBit(m, n) { return (m >> n) & 1; } //n月是大月還是小月? function getInfo() { //用戶輸入日期! var arr = []; strData = prompt("請(qǐng)輸入年 月 日,并以空格隔開(kāi)!", ""); if (strData == null || strData == "") { alert("輸入錯(cuò)誤!請(qǐng)刷新!"); return false; } arr = strData.split(" "); y = arr[0]; m = arr[1] - 1; d = arr[2]; TheDate = new Date(y, m, d); } //getinfo(); function e2c() { getInfo(); var total, m, n, k; var isEnd = false; var tmp = TheDate.getYear(); if (tmp < 1900) tmp += 1900; //無(wú)用! total = (tmp - 2001) * 365 + Math.floor((tmp - 2001) / 4) + madd[TheDate.getMonth()] + TheDate.getDate() - 23; //2001年1月23是除夕;該句計(jì)算到起始年正月初一的天數(shù) if (TheDate.getYear() % 4 == 0 && TheDate.getMonth() > 1) total++; //當(dāng)年是閏年且已過(guò)2月再加一天! for (m = 0;; m++) { k = (CalendarData[m] < 0xfff) ? 11 : 12; //起始年+m閏月嗎? for (n = k; n >= 0; n--) { if (total <= 29 + GetBit(CalendarData[m], n)) //已找到農(nóng)歷年! { isEnd = true; break; } total = total - 29 - GetBit(CalendarData[m], n); //尋找農(nóng)歷年! } if (isEnd) break; } cYear = 2001 + m; //農(nóng)歷年 cMonth = k - n + 1; //農(nóng)歷月 cDay = total; //農(nóng)歷日 if (k == 12) //閏年! { if (cMonth == Math.floor(CalendarData[m] / 0x10000) + 1) //該月就是閏月! cMonth = 1 - cMonth; if (cMonth > Math.floor(CalendarData[m] / 0x10000) + 1) cMonth--; //該月是閏月后某個(gè)月! } cHour = Math.floor((TheDate.getHours() + 1) / 2); } function GetcDateString() { var tmp = ""; tmp += tgString.charAt((cYear - 4) % 10); //年干 tmp += dzString.charAt((cYear - 4) % 12); //年支 tmp += "年("; tmp += sx.charAt((cYear - 4) % 12); tmp += ")"; if (cMonth < 1) { tmp += "閏"; tmp += monString.charAt( - cMonth - 1); // 閏幾月! } else tmp += monString.charAt(cMonth - 1); tmp += "月"; tmp += (cDay < 11) ? "初": ((cDay < 20) ? "十": ((cDay < 30) ? "廿": "卅")); // 初幾! if (cDay % 10 != 0 || cDay == 10) tmp += numString.charAt((cDay - 1) % 10); if (cHour == 12) tmp += "夜"; tmp += dzString.charAt((cHour) % 12); tmp += "時(shí)"; //幾時(shí)! cDateString = tmp; return tmp; } function GetDateString() //公歷時(shí)間! { var tmp = ""; var t1 = TheDate.getYear(); if (t1 < 1900) t1 += 1900; tmp += t1 + "-" + (TheDate.getMonth() + 1) + "-" + TheDate.getDate() + " " + TheDate.getHours() + ":" + ((TheDate.getMinutes() < 10) ? "0": "") + TheDate.getMinutes() + " 星期" + weekString.charAt(TheDate.getDay()); DateString = tmp; return tmp; } function cnCanlender() { init(); e2c(); GetDateString(); GetcDateString(); strcnCanlender.innerText = DateString + "\n" + cDateString; //顯示! } </script> </head> <body> 要保存一年的信息,其實(shí)只要兩個(gè)信息就可以了:1.農(nóng)歷每個(gè)月的大小?<br/>2.今年是否有閏月.<br/>3.閏幾月以及閏月的大小.<br/><br/>用一個(gè)整數(shù)來(lái)保存這些信息就足夠了.<br/>具體的方法是:用一位來(lái)表示一個(gè)月的大?<br/> 笤錄俏?,小月記為0,這樣就用掉12 位(無(wú)閏月)或13 位(有閏月),再用高4位來(lái)表示閏月的月份,沒(méi)有閏月記為0.<br/>比如說(shuō),2 0 0 0 年的信息數(shù)據(jù)是0 x C 9 6 ,化成二進(jìn)制就是110010010110B,表示的含義是指1、2、5、8、10、11月大,其余月小.<br/>2001 年的農(nóng)歷信息數(shù)據(jù)是0x41A95,其中4表示今年閏4月,月份大小信息就是0x1A95(因?yàn)殚c月,所以有13 位),具體的就是1、2、4、5、8、10、12月大,其余月份?<br/>?x1A95=1101010010101B),4月的后面那一個(gè)0表示的是閏4月?<br/> 幼諾哪歉?表示5月大.<br/>這樣就可以用一個(gè)數(shù)組來(lái)保存這些信息.<br/>在我的JavaScript腳本程序中是用CalendarData[]這個(gè)數(shù)組來(lái)保存這些信息的.<br/>下面就是公歷轉(zhuǎn)換成農(nóng)歷的具體算法:1.計(jì)算出所求時(shí)間到起始年正月初一的天數(shù).<br/>2.從起始年份開(kāi)始,減去每一月的天數(shù),一直到剩余天數(shù)沒(méi)有下一個(gè)月多為止.<br/>此時(shí),CalendarData[]的下標(biāo)到了多少,就是減去了多少年,用起始年份加上這個(gè)下標(biāo)就可以得到農(nóng)歷年份,然后看減去了幾個(gè)月.<br/>如果本年不閏月或者閏月還在后面,就可以直接得到農(nóng)歷月份,如果在閏月月份數(shù)后面一個(gè)月,則這個(gè)月就是閏月,如果在閏月的后面,則要減去1 才能得到月份數(shù).<br/>剩余的天數(shù)就是農(nóng)歷日,農(nóng)歷時(shí)用(公歷時(shí)+1)/2 就可以簡(jiǎn)單地得到了.<br/> <hr color="#00ff00"/> <input type="button" value="開(kāi)始轉(zhuǎn)換" onclick="cnCanlender()"/> <div id="strcnCanlender" name="strcnCanlender"> </div> </body> </html>
運(yùn)行效果圖如下:
PS:這里再為大家推薦幾款日歷相關(guān)在線工具供大家參考:
網(wǎng)頁(yè)萬(wàn)年歷日歷:
http://tools.jb51.net/bianmin/webwannianli
在線陰歷/陽(yáng)歷轉(zhuǎn)換工具:
http://tools.jb51.net/bianmin/yinli2yangli
在線萬(wàn)年歷日歷:
http://tools.jb51.net/bianmin/wannianli
在線萬(wàn)年歷黃歷flash版:
http://tools.jb51.net/bianmin/flashwnl
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript時(shí)間與日期操作技巧總結(jié)》《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
- Javascript農(nóng)歷與公歷相互轉(zhuǎn)換的簡(jiǎn)單實(shí)例
- js實(shí)現(xiàn)帶農(nóng)歷和八字等信息的日歷特效
- 獲取陰歷(農(nóng)歷)和當(dāng)前日期的js代碼
- javascript實(shí)現(xiàn)帶節(jié)日和農(nóng)歷的日歷特效
- Javascript獲取當(dāng)前日期的農(nóng)歷日期代碼
- 顯示今天的日期js代碼(陽(yáng)歷和農(nóng)歷)
- JS獲取農(nóng)歷日期具體實(shí)例
- JavaScript轉(zhuǎn)換農(nóng)歷類實(shí)現(xiàn)及調(diào)用方法
- 很全的顯示陰歷(農(nóng)歷)日期的js代碼
相關(guān)文章
JavaScript forEach中return失效問(wèn)題解決方案
這篇文章主要介紹了JavaScript forEach中return失效問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06boostrap模態(tài)框二次彈出清空原有內(nèi)容的方法
今天小編就為大家分享一篇boostrap模態(tài)框二次彈出清空原有內(nèi)容的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08JavaScript實(shí)現(xiàn)九宮格拖拽效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)九宮格拖拽效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06JS實(shí)現(xiàn)下拉框的動(dòng)態(tài)添加(附效果)
頁(yè)面初加載時(shí):選擇車類型后:選擇車顏色后:JS實(shí)現(xiàn)下拉框的動(dòng)態(tài)添加,網(wǎng)頁(yè)代碼如下:動(dòng)態(tài)添加下拉框 車類型:請(qǐng)選擇寶馬、奔馳 車顏色2013-04-04一文詳解如何在項(xiàng)目中和平時(shí)練習(xí)中應(yīng)用es6語(yǔ)法
ES6是JavaScript的一個(gè)版本,因?yàn)槲覀兦懊嬗玫降膙ue默認(rèn)使用ES6語(yǔ)法開(kāi)發(fā),所以我們?cè)谶@一節(jié)補(bǔ)充ES6的知識(shí)點(diǎn),下面這篇文章主要給大家介紹了關(guān)于如何在項(xiàng)目中和平時(shí)練習(xí)中應(yīng)用es6語(yǔ)法的相關(guān)資料,需要的朋友可以參考下2022-11-11js中設(shè)計(jì)一段程序,讓它能夠打印自己的方法收集藏
js中設(shè)計(jì)一段程序,讓它能夠打印自己的方法收集藏...2007-03-03JavaScript高級(jí)程序設(shè)計(jì)(第三版)學(xué)習(xí)筆記6、7章
這篇文章主要介紹了JavaScript高級(jí)程序設(shè)計(jì)(第三版)學(xué)習(xí)筆記6、7章 的相關(guān)資料,需要的朋友可以參考下2016-03-03JavaScrip報(bào)錯(cuò):module?is?not?defined的原因及解決
這篇文章主要給大家介紹了關(guān)于JavaScrip報(bào)錯(cuò):module?is?not?defined的原因及解決方法,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09基于BootStrap的Metronic框架實(shí)現(xiàn)頁(yè)面鏈接收藏夾功能按鈕移動(dòng)收藏記錄(使用Sortable進(jìn)行拖動(dòng)排序)
這篇文章主要介紹了基于BootStrap的Metronic框架實(shí)現(xiàn)頁(yè)面鏈接收藏夾功能按鈕移動(dòng)收藏記錄(使用Sortable進(jìn)行拖動(dòng)排序)的相關(guān)資料,非常不錯(cuò),需要的朋友可以參考下2016-08-08