娱乐城威博娱乐城


娱乐城威博娱乐城生活中,刻意去找的东西,往往是找不到的。我们所做的每一件事,不管是好是坏,在这当下都是最好的选择;因为天下万物的来去,都有他的时间。每个人的人生不管是壮丽抑或平淡,最终都会抵达同样的终点。当我们垂垂老矣,记忆逐渐凋零,唯有心灵还会与我们同行,一起走完这趟旅程。
娱乐城威博娱乐城这个大队长放下电话,越想越气,真恨不得马上就扇他们几巴掌。娱乐城威博娱乐城许宁远顿了一下,抬起头,目光没有任何焦距。他只比划了一个噤声的手势,继续唱着
娱乐城威博娱乐城又玩了两锅,渐渐地运气好像不在庄家那边了,尤其是这一锅,这哥们刚拿了5万块钱上庄,可两把就被人包了底,输光了,庄家郁闷得不行,大骂不已,不过好像大家都很熟,根本就不在意。不过想想这帮人真的很有意思,赢了骂天骂娘,输了也骂天骂娘,不知道老天爷和他娘会作何感想。娱乐城威博娱乐城青春既是过去的时候
娱乐城威博娱乐城当前userid:3780007

    当前username:likexiang1970打击盗版,支持正版,请到逐浪手机版m.zhulang阅读最新内容。娱乐城威博娱乐城我想他不知道,或者是已经被愤怒击昏了理智和原先的聪慧。老版《文化苦旅》的成功,我个人觉得不无是他站在历史的,民族的,超然物外的,悲天悯人的角度,感知中华文化的脉络,感悟中华文化的悲情,并朦胧中给人以指向性,得到了中华儿女的普遍认同,甚至蜚声于外。但新版后四篇却显然选择了不同的路径,俨然还南辕北辙了。
娱乐城威博娱乐城那是什么手法,什么手段?张浩文和纽顿同样呆住了,前者眼里闪过惊人的兴奋之色,而后者眼里却闪过一缕莫名的精光,让人不寒而栗的光芒!娱乐城威博娱乐城文/实名倪涛,QQ:823838548!本人第399篇文章,分享是一种美德,坚持总会结出果实!
娱乐城威博娱乐城月色斑驳
娱乐城威博娱乐城楼主男手机店主……  前几天来了一个大爷,  目测六七十的样子,  充了50话费,  第二天又来充了五十话费。  我问怎么用的这么快,  大爷竟然告诉我说在谈对象。。。。  尼玛,活该我单身男屌丝,  要有大爷这种活到老谈到老的精神。娱乐城威博娱乐城过年带女友回家,饭桌上,开始还挺斯文的,别说不喝酒就连菜都不好意思夹,老爸说:“闺女到这就像到自己家里一样,不要拘束,”从老爸句话过后,女友和老爸碰了一杯接着和小叔碰了一杯,接着两杯三杯。。。都喝的差不多了,女友和小叔掰腕子,和老爸唠家常,我拉女友别喝了,她竟然一把把我推到在地,然后对我爸说““大爷,你儿子跟着我,你就放一百个心,我绝对不会让别人欺负他的。”娱乐城威博娱乐城对了,买福利彩票,前些日子咱蓉城里不是有人中了两亿元吗?

皇冠足球比分

大发论坛时时彩平台尊龙娱乐是黑网吗海天国际娱乐城注册送钱凯发娱乐乐宝娱乐城真人赌钱bodog888亚美国际娱乐城 金龙国际 www.am8.com 亚洲城娱乐 老k国际娱乐城 666k8.com 金威国际娱乐城 名人国际娱乐城 ag娱乐平台 V博娱乐城 百家注册送钱e8889.com网站地图博彩网站网站地图http://tinyurl.com/pqcd7vj网站地图新得利国际线上娱乐网站地图网上博彩娱乐推荐网网站地图皇冠足球比分网站地图http://tinyurl.com/qxkdfcf网站地图http://tinyurl.com/ozp37ox网站地图凯发娱乐 比特币网站地图凯发国际注册送钱e8889.com网站地图银泰娱乐真钱骰宝网站地图乐橙娱乐网站地图亚洲赌博网网站地图皇冠足球比分注册送钱e8889.com网站地图赌球独赢网站地图http://tinyurl.com/qz29zvt网站地图博狗提款网站地图百利代理网站地图

Fork me on GitHub

simplify the life

思考题:如何获取当天的农历日期?

万年历大家肯定都用过,一般都有阳历、农历、节气等信息,但是你是否想过农历日期是如何获取的?

阳历日期的获取很简单,以 Javascript 为例,有 Date 对象,可以调用它的 API 获取年、月、日信息,但是农历日期并不像阳历一样有规律,更别谈 API 了。所以,对于农历日期的获取我们只能打表。

纳尼,打表?岂不是 1 年 365 天要打 365 个值的表么?非也。我们先来了解下农历的一些基本信息,农历一年有 12 个月或者 13 个月,每个月 29 天或者 30 天。如果哪一年有 13 个月,那么多出来的月叫做闰月,比方说农历 2001 年有两个四月,那么多出来的四月就叫做闰四月,紧跟在四月后,通常每 19 年就会有 7 个闰月,于是你可能在某一年过过两次农历生日。(详见 历法

如果今天是 2000 年 1 月 1 日(阳历),让你求 100 天后的日期(阳历),相信并不会很困难(甚至可以直接用 setDate() 方法)。如果今天是 2000 年 1 月 1 日(农历),让你求 100 天后的日期(农历),怎么做?没错,我们需要的仅仅只是农历月份的一些数据而已,而这些数据我们不得不通过一些渠道去获得。

这样,求解当天农历日期的过程似乎可以呼之欲出了。我们以某天为基准,比方说 2000 年 2 月 5 日(农历正月初一),我们先算得今天和基准日期的时间天数间隔(假设为 n 天),然后再去求农历 2000 年正月初一之后 n 天的日期。

将每一年的农历月份信息存储下来也需要一定的技巧,这里采用二进制进行存储。用 12 位二进制代表 12 个月的年份,用 13 位代表 13 个月的年份。在每个位置上,用 1 表示当月有 30 天,0 表示 29天。

比方说 2000 年我们可以用 110010010110 表示,它表示一月、二月、五月、八月、十月以及十一月有30天,其余 29 天,为了方便我们将该数用十六机制 0xc96 表示。有闰月的年份怎么表示呢?比方说 2001 年有个闰四月,我们用 13 个二进制数 1101010010101 表示该年,其中第 5 个数字 0 表示闰四月有 29 天,但是因为 13 个二进制数表示十六进制不方便,我们再在前面加上 3 个 0,0001, 1010, 1001, 0101,最后我们还得知道闰月是在几月份,我们将其加在最前面,比如 2001 年是闰四月,四的二进制表示为 0100,我们将它加在最前面,0100, 0001, 1010, 1001, 0101,用十六进制表示为 0x41A95。

代码很简答,都有注释:

// 仅使用于阳历2001年-2020年之间阳历-农历转换
function getLunarDay(y, m, d) {
  // 2000 - 2020
  // 0xC96 110010010110
  var data =  [0xc96, 0x41A95, 0xD4A, 0xDA5, 0x20B55, 0x56A, 0x7155B, 0x25D, 0x92D, 0x5192B,
               0xA95, 0xB4A, 0x416AA, 0xAD5, 0x90AB5, 0x4BA, 0xA5B, 0x60A57, 0x52B, 0xA93, 0x40E95];

  // 以 2000 年 2 月 5 日为基准(农历正月初一)
  var standard = new Date(2000, 1, 5);

  // 将日期对象化
  var cur = new Date(y, m, d); 

  // 间隔的日期天数
  var gap = (cur.getTime() - standard.getTime()) / 1000 / 3600 / 24 + 1;
  
  // 确认是不是 i 年
  for (var i = 2000; i <= 2020; i++) {
    var yearDays = getYearDays(i);
    // 就是 i 年
    if (gap <= yearDays) {
      var leapMonth = getLeapMonth(i)
        , totalMonths = leapMonth ? 13 : 12;

      // 遍历月份
      for (var j = 0; j < totalMonths; j++) {
        var days = data[i - 2000] & (1 << (totalMonths - j - 1)) ? 30 : 29;
        // 不是 j 月
        if (gap > days) {
          gap -= days;
        } else {
          if (leapMonth) {  // 如果当年有闰月,还需判断
            if (j < leapMonth)
              return [i, j + 1, gap, 0];
            else if (j === leapMonth)
              return [i, j, gap, 1];
            else 
              return [i, j, gap, 0];
          } else {
            return [i, j + 1, gap, 0];  // i 年 j+1 月 gap 日,0 表示非闰月
          }
        }
      }
    } else {
      gap -= yearDays;
    }
  }


  // 获取 year 年的闰月月份,如果没有,返回 0 
  function getLeapMonth(year) {
    year -= 2000;
    var month = 0;
    for (var i = 16; i < 20; i++) 
      month += data[year] & (1 << i);
    return month >> 16;
  }

  // 获取 year 年农历总天数
  function getYearDays(year) {
    var leapMonth = getLeapMonth(year)
      , totalMonths = leapMonth ? 13 : 12;

    var totalDays = 0;
    // 2001 
    // 0100, 0001, 1010, 1001, 0101
    for (var i = 0; i < totalMonths; i++) {
      var tmp = totalMonths - i - 1;
      if (data[year - 2000] & (1 << tmp))
        totalDays += 30;
      else 
        totalDays += 29;
    }
    return totalDays;
  }
}


// 调用
var now = new Date();
var ans = getLunarDay(now.getFullYear(), now.getMonth(), now.getDate());
console.log(ans);

var tmp = getLunarDay(2017, 7, 18);  // 2017-8-18
console.log(tmp); // [2017, 6, 27, 1]

除了一些计算外,最关键的当属将一年的农历月份信息用一个整数来保存,除了上述的方法外,当然还有很多信息压缩的办法。比如有一种这样运算,先跟上文说的一样将 12 个月的信息用 12 个二进制数表示,比如 2000 年表示为 110010010110,然后在末尾添加 4 位表示闰月月份,没有闰月用 0 表示,比如 2000 年表示为 110010010110,0000。对于 2000 年这样就算结束了,但是 2001 年表示为 110110010101,0100 后,并不知道闰月是多少天,我们规定,如果是 30 天就在前面再添加个 1,比如 2017 年是闰六月大,用二进制表示为 1,010100010111,0110

这样,对于 2017 年来说,它能用二进制 10101000101110110 表示,也能用十进制 86390 表示,也能用十六进制 0x15176 表示,为了压缩字节码节省空间,我们用 36 进制数 1unq 表示(toString() 方法参数范围2-36)。

这里把 1901-2050 的 150 个 36 进制表示字符串列一下,有需要的可以直接获取。

var map = 'ezc|esg|wog|gr9|15k0|16xc|1yl0|h40|ukw|gya|esg|wqe|wk0|15jk|2k45|zsw|16e8|yaq|tkg|1t2v|ei8|wj4|zp1|l00|lkw|2ces|8kg|tio|gdu|ei8|k12|1600|1aa8|lud|hxs|8kg|257n|t0g|2i8n|13rk|1600|2ld2|ztc|h40|2bas|7gw|t00|15ma|xg0|ztj|lgg|ztc|1v11|fc0|wr4|1sab|gcw|xig|1a34|l28|yhy|xu8|ew0|xr8|wog|g9s|1bvn|16xc|i1j|h40|tsg|fdh|es0|wk0|161g|15jk|1654|zsw|zvk|284m|tkg|ek0|xh0|wj4|z96|l00|lkw|yme|xuo|tio|et1|ei8|jw0|n1f|1aa8|l7c|gxs|xuo|tsl|t0g|13s0|16xg|1600|174g|n6a|h40|xx3|7gw|t00|141h|xg0|zog|10v8|y8g|gyh|exs|wq8|1unq|gc0|xf4|nys|l28|y8g|i1e|ew0|wyu|wkg|15k0|1aat|1640|hwg|nfn|tsg|ezb|es0|wk0|2jsm|15jk|163k|17ph|zvk|h5c|gxe|ek0|won|wj4|xn4|2dsl|lk0|yao'.split('|');
for (var i = map.length; i--; ) 
  map[i] = parseInt(map[i], 36);

read more:

posted on 2015-11-30 07:08 韩子迟 阅读(...) 评论(...) 编辑 收藏

导航

统计信息

News