用JS 重新造了個輪子,農曆計算指令碼,有詳細的注釋

2021-09-17 21:50:39 字數 3373 閱讀 4450

工作中有時需要農曆計算,之前從網上找了個js版本的(摘自wannianli.htm,網上匯出都是),直接呼叫就可以了,非常方便。有優點就有缺點,該版本檔案有點大(20kb以上);有很多**用不到;**注釋不夠直白;理解其原理有點麻煩。

之前用過多次,對原理也不是很清楚,最近專案需要,重新造了一遍輪子。包含原始碼注釋的檔案控制在7kb以內,壓縮後再3kb以內。

在重新造輪子之前,準備對效能優化下。想到的可以優化的部分如下:

1、在年份計算天數時,每次都要迴圈計算與 1900 年 的 日期天數,將計算天數改為 2016-2-8(春節)。

2、每次計算 都要重新計算天數,考慮第一次計算當年天數後,加入快取機制。

3、每次獲取 農曆 資訊時,如果已經根據年份獲取到 農曆資訊,可以傳給相關函式,不用重新計算。

4、最重要的,只寫農曆計算相關的計算,其他無功能,如果需要,通過 requrie 本指令碼。

造完輪子之後,發現能優化的程度有限,效能與之前提公升不大(計算40次 大約都在 0.003 – 0.005 秒左右),最終 取消了 第2項 快取(節省記憶體)。

/*

源**:

壓縮版:

*/var lunar = ,

//返回閏月是哪個月,沒有閏月返回0

getleapmonth : function(year, lunardata),

//返回閏月天數

getleapdays : function(year, lunardata)else

},//農曆某年某月的天數

getmonthdays : function(year, month, lunardata),

//農曆年總天數

getlunardays : function(year, lunardata);

if( year in this.cachelunardays )

*/var days = 348; //本年的12個月,都當作小月處理。 12 x 29 = 348

/*5-16位 表示每個月的天數

lunardata : ***x 0100 0100 0100 ***x

0x8000 : 0000 1000 0000 0000 0000

&運算 : 0000 0000 0000 0000 0000

0x8 : 0000 0000 0000 0000 1000

&運算 : 0000 0000 0000 0000 0000

*/for(var monthindex = 0x8000; monthindex > 0x8; monthindex >>= 1)

return days + this.getleapdays(year, lunardata);

/*this.cachelunardays[year] = days + this.getleapdays(year, lunardata);

return this.cachelunardays[year];

*/},

//傳入乙個日期,計算農曆資訊

tolunar : function(date, _date);

var currentyear = 2016; //當前年份

var lunardata = this.getdata(currentyear); //快取 lunardata,節省效能

var lunardays = this.getlunardays(currentyear, lunardata); //農曆天數

/*daysoffset == 相差天數

為了減少不必要的效能浪費(為什麼要從1900算到今年),參考日期以2023年春節為準(2016-2-8)

*/var daysoffset = (new date(date.getfullyear(), date.getmonth(), date.getdate()) - new date(2016, 1, 8)) / 86400000;

//獲取年數

if( daysoffset >= lunardays )

}else if( daysoffset < 0 )

daysoffset++;

}_date.lunaryear = currentyear;

//本年是否為閏月

var leapmonth = this.getleapmonth(currentyear, lunardata);

//獲取月數

var currentmonth, currentmonthdays;

for(currentmonth = 1; currentmonth < 12 ; currentmonth++ )

}currentmonthdays = this.getmonthdays(currentyear, currentmonth);

if( daysoffset > currentmonthdays )else

}_date.lunarmonth = currentmonth;

//獲取日

_date.lunarday = daysoffset;

return _date;

},//返回今日資訊

today : function()

}; //如果需要模組匯出

= lunar;

使用方法:

lunar.tolunar(new date())

/*object

*/

還可以傳入js物件,

var date = new date();

var _date = ;

_date.value = [_date.year, _date.month, _date.date].map(function(n)).join("-");

/*object {

date: wed nov 09 2016 18:56:09 gmt+0800 (中國標準時間),

year: 2016,

month: 11,

date: 9,

day: 3,

value: "2016-11-09"

*/_date = lunar.tolunar(date, _date);

/*object {

date: wed nov 09 2016 18:56:09 gmt+0800 (中國標準時間),

year: 2016,

month: 11,

date: 9,

day: 3,

value: "2016-11-09",

isleap: false,

lunarday: 10,

lunarmonth: 10,

lunaryear: 2016

*/

用js實現頁面刪除並重新排序

首先,用jqury選擇器,選中勾選的行 var cks indicator table find input type checkbox checked 然後彈出乙個確認是否刪除框,為是否刪除框中的確定繫結乙個delind 事件 先在頁面把選中的那一行,remove或者html 掉,indicato...

用css給小程式畫個簡單寫輪眼

之前看到過乙個h5的迷幻動畫,正好今天有時間,把這個也簡單畫了一下。重複建立幾個view,每個view為之前90 大小,並居中 為預期轉動的view設定css動畫 實際就上面兩點,很簡單。看一下實際的 wxml class container class square class square bl...

用乙個小程式重新認識「 」與「 」

上午寫了個提 拐點的程式,很簡單,但是遇到提示選擇時用 取消 就會報錯。程式如下 using system using system.text using using autodesk.autocad.runtime using autodesk.autocad.databaseservices u...