工作中有時需要農曆計算,之前從網上找了個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...