国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

用JS 重新造了個輪子,農歷計算腳本,有詳細的注釋

zhigoo / 3275人閱讀

摘要:在重新造輪子之前,準備對性能優化下。最重要的,只寫農歷計算相關的計算,其他無功能,如果需要,通過本腳本。為除了閏月外的正常月份是大月還是小月,為天,為天。表示閏月是大月還是小月,僅當存在閏月的情況下有意義。

工作中有時需要農歷計算,之前從網上找了個JS版本的(摘自wannianli.htm,網上導出都是),直接調用就可以了,非常方便。有優點就有缺點,該版本文件有點大(20KB以上);有很多代碼用不到;代碼注釋不夠直白;理解其原理有點麻煩。

之前用過多次,對原理也不是很清楚,最近項目需要,重新造了一遍輪子。包含源碼注釋的文件控制在7KB以內,壓縮后再3KB以內。

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

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

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

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

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

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

</>復制代碼

  1. /*
  2. 原文地址:http://www.miaoqiyuan.cn/p/lunar
  3. 源代碼:http://www.miaoqiyuan.cn/products/lunar/lunar.js
  4. 壓縮版:http://www.miaoqiyuan.cn/products/lunar/lunar.min.js
  5. */
  6. var lunar = {
  7. data : [
  8. /*
  9. 二進制形式
  10. xxxx xxxx xxxx xxxx xxxx
  11. 20-17 16-12 12-9 8-5 4-1
  12. 1-4: 表示當年有無閏年,有的話,為閏月的月份,沒有的話,為0。
  13. 5-16:為除了閏月外的正常月份是大月還是小月,1為30天,0為29天。
  14. 注意:從1月到12月對應的是第16位到第5位。
  15. 17-20: 表示閏月是大月還是小月,僅當存在閏月的情況下有意義。
  16. 舉個例子:
  17. 以我的生日1987年威力,1987年的數據是: 0x0af46
  18. 二進制:0000 1010 1111 0100 0110
  19. 從1月到12月的天數依次為:
  20. 5-16位 1 0 1 0 1 1 1 1 0 1 0 0
  21. 每月日數 30 29 30 29 30 30 30 30 29 30 29 29
  22. 對應月份 1 2 3 4 5 6 7 8 9 10 11 12
  23. 0110 (1-4位) 表示1987年有閏月,閏六月
  24. 0000 (17-20位) 存在閏月,本字段有效,表示閏小月 29天
  25. 補充閏月后的每月日期
  26. 每月日數 30 29 30 29 30 30 29 30 30 29 30 29 29
  27. 對應月份 1 2 3 4 5 6 閏 7 8 9 10 11 12
  28. */
  29. 0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, //1900-1909
  30. 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, //1910-1919
  31. 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, //1920-1929
  32. 0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, //1930-1939
  33. 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, //1940-1949
  34. 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, //1950-1959
  35. 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, //1960-1969
  36. 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, //1970-1979
  37. 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, //1980-1989
  38. 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0, //1990-1999
  39. 0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, //2000-2009
  40. 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, //2010-2019
  41. 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, //2020-2029
  42. 0x05aa0, 0x076a3, 0x096d0, 0x04bd7, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, //2030-2039
  43. 0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, //2040-2049
  44. 0x14b63 //2050
  45. ],
  46. //獲取農歷年份信息
  47. getData : function(year){
  48. return this.data[year - 1900];
  49. },
  50. //返回閏月是哪個月,沒有閏月返回0
  51. getLeapMonth : function(year, lunarData){
  52. lunarData = lunarData || this.getData(year); //如果傳入lunarData,為了提高性能,不再進行計算
  53. /*
  54. 1-4位表示閏月,例如:0010
  55. lunarData : xxxx xxxx xxxx xxxx 0010
  56. 0xf : 0000 0000 0000 0000 1111
  57. &運算 : 0000 0000 0000 0000 0010
  58. */
  59. return lunarData & 0xf;
  60. },
  61. //返回閏月天數
  62. getLeapDays : function(year, lunarData){
  63. lunarData = lunarData || this.getData(year);
  64. if( this.getLeapMonth(year, lunarData) ){
  65. /*
  66. 17-20位表示閏月是大小月,例如:0001
  67. lunarData : 0000 xxxx xxxx xxxx xxxx
  68. 0x10000 : 0001 0000 0000 0000 0000
  69. &運算 : 0000 0000 0000 0000 0000
  70. */
  71. return (lunarData & 0x10000) ? 30 : 29;
  72. }else{
  73. return 0;
  74. }
  75. },
  76. //農歷某年某月的天數
  77. getMonthDays : function(year, month, lunarData){
  78. lunarData = lunarData || this.getData(year);
  79. /*
  80. 5-16位 表示每個月的天數
  81. lunarData : xxxx 0100 0100 0100 xxxx
  82. 0x8000 : 0000 1000 0000 0000 0000
  83. 0x8000>>8 : 0000 0000 0001 0000 0000
  84. &運算 : 0000 0000 0000 0000 0000
  85. */
  86. return (lunarData & 0x8000>>month) ? 30 : 29;
  87. },
  88. //農歷年總天數
  89. getLunarDays : function(year, lunarData){
  90. lunarData = lunarData || this.getData(year);
  91. //如果存在 總天數 緩存,則返回緩存
  92. /*
  93. this.cacheLunarDays = this.cacheLunarDays || {};
  94. if( year in this.cacheLunarDays ){
  95. return this.cacheLunarDays[year];
  96. }
  97. */
  98. var days = 348; //本年的12個月,都當作小月處理。 12 x 29 = 348
  99. /*
  100. 5-16位 表示每個月的天數
  101. lunarData : xxxx 0100 0100 0100 xxxx
  102. 0x8000 : 0000 1000 0000 0000 0000
  103. &運算 : 0000 0000 0000 0000 0000
  104. 0x8 : 0000 0000 0000 0000 1000
  105. &運算 : 0000 0000 0000 0000 0000
  106. */
  107. for(var monthIndex = 0x8000; monthIndex > 0x8; monthIndex >>= 1){
  108. days += (lunarData & monthIndex) ? 1 : 0;
  109. }
  110. return days + this.getLeapDays(year, lunarData);
  111. /*
  112. this.cacheLunarDays[year] = days + this.getLeapDays(year, lunarData);
  113. return this.cacheLunarDays[year];
  114. */
  115. },
  116. //傳入一個日期,計算農歷信息
  117. toLunar : function(date, _date){
  118. //如果傳入 _date,則將農歷信息添加到 _date中
  119. var _date = _date || {};
  120. var currentYear = 2016; //當前年份
  121. var lunarData = this.getData(currentYear); //緩存 lunarData,節省性能
  122. var lunarDays = this.getLunarDays(currentYear, lunarData); //農歷天數
  123. /*
  124. daysOffset == 相差天數
  125. 為了減少不必要的性能浪費(為什么要從1900算到今年),參考日期以2016年春節為準(2016-2-8)
  126. */
  127. var daysOffset = (new Date(date.getFullYear(), date.getMonth(), date.getDate()) - new Date(2016, 1, 8)) / 86400000;
  128. //獲取年數
  129. if( daysOffset >= lunarDays ){
  130. //2017年和以后
  131. while( daysOffset >= lunarDays ){
  132. daysOffset -= lunarDays;
  133. lunarData = this.getData(++currentYear);
  134. lunarDays = this.getLunarDays(currentYear, lunarData);
  135. }
  136. }else if( daysOffset < 0 ){
  137. //2016年前
  138. while( daysOffset < 0 ){
  139. lunarData = this.getData(--currentYear);
  140. lunarDays = this.getLunarDays(currentYear, lunarData);
  141. daysOffset += lunarDays;
  142. }
  143. daysOffset++;
  144. }
  145. _date.lunarYear = currentYear;
  146. //本年是否為閏月
  147. var leapMonth = this.getLeapMonth(currentYear, lunarData);
  148. //獲取月數
  149. var currentMonth, currentMonthDays;
  150. for(currentMonth = 1; currentMonth < 12 ; currentMonth++ ){
  151. _date.isLeap = false;
  152. ///如果有閏月
  153. if( leapMonth ){
  154. if( currentMonth > leapMonth ){
  155. currentMonth--;
  156. leapMonth = 0;
  157. _date.isLeap = true;
  158. }
  159. }
  160. currentMonthDays = this.getMonthDays(currentYear, currentMonth);
  161. if( daysOffset > currentMonthDays ){
  162. daysOffset -= currentMonthDays;
  163. }else{
  164. break;
  165. }
  166. }
  167. _date.lunarMonth = currentMonth;
  168. //獲取日
  169. _date.lunarDay = daysOffset;
  170. return _date;
  171. },
  172. //返回今日信息
  173. today : function(){
  174. return this.toLunar(new Date());
  175. }
  176. };
  177. //如果需要模塊導出
  178. //module.exports = lunar;

使用方法:

</>復制代碼

  1. lunar.toLunar(new Date())
  2. /*
  3. Object {
  4. lunarYear: 2016, //農歷年
  5. isLeap: false, //是否是閏月
  6. lunarMonth: 10, //農歷月
  7. lunarDay: 10 //農歷日
  8. }
  9. */

還可以傳入JS對象,

</>復制代碼

  1. var date = new Date();
  2. var _date = {
  3. Date : date,
  4. year : date.getFullYear(),
  5. month : date.getMonth() + 1,
  6. date : date.getDate(),
  7. day : date.getDay()
  8. };
  9. _date.value = [_date.year, _date.month, _date.date].map(function(n){
  10. n = n.toString();
  11. return n[1] ? n : "0" + n;
  12. }).join("-");
  13. /*
  14. Object {
  15. Date: Wed Nov 09 2016 18:56:09 GMT+0800 (中國標準時間),
  16. year: 2016,
  17. month: 11,
  18. date: 9,
  19. day: 3,
  20. value: "2016-11-09"
  21. */
  22. _date = lunar.toLunar(date, _date);
  23. /*
  24. Object {
  25. Date: Wed Nov 09 2016 18:56:09 GMT+0800 (中國標準時間),
  26. year: 2016,
  27. month: 11,
  28. date: 9,
  29. day: 3,
  30. value: "2016-11-09",
  31. isLeap: false,
  32. lunarDay: 10,
  33. lunarMonth: 10,
  34. lunarYear: 2016
  35. */

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80823.html

相關文章

  • 嘗試了個工具類庫,名為 Diana

    摘要:的另一種形式測試踩坑之路代碼覆蓋率單元測試的代碼覆蓋率統計,是衡量測試用例好壞的一個的方法。 showImg(https://segmentfault.com/img/remote/1460000012564211?w=640&h=280); 項目地址: diana文檔地址: http://muyunyun.cn/diana/ 造輪子的意義 為啥已經有如此多的前端工具類庫還要自己造輪...

    zhichangterry 評論0 收藏0
  • 不到300行代碼構建精簡koa和koa-router(mini-koa)

    摘要:詳細代碼如下追蹤賦值里面的是子路由設計子路由設計這個比較簡單,每個子路由維護一個路由監聽列表,然后通過調用的函數添加到主路由列表上。 showImg(https://segmentfault.com/img/bVbruD0?w=756&h=378); 前言 鑒于之前使用express和koa的經驗,這兩天想嘗試構建出一個koa精簡版,利用最少的代碼實現koa和koa-router,同時...

    tuomao 評論0 收藏0
  • 原生js+css 實現 material design 點擊效果

    摘要:最近想要在按鈕上添加的點擊效果,看了看,單純的想要這種效果,而要引入一些不必要的內容覺得不劃算,然后自己動手造了個輪子。項目地址上傳不了圖只能用了效果使用文字只要在內添加并且在內傳入便可以實現水波紋效果。 最近想要在按鈕上添加material design的點擊效果,看了看muse-ui,單純的想要這種效果,而要引入一些不必要的內容覺得不劃算,然后自己動手造了個輪子。項目地址:gith...

    NickZhou 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<