vue实现农历日期选择器

在项目中会员进行注册的时候需要进行生日的选择,由于通用的UI库都是公历的并且万年历的形式不符合。也在网上查了好多资料,最后找到一套算法感觉还是不错的。经过加工分析封装成了一个vue组件。

实现公农历转换的算法

/**
  * 数组LunarDaysOfMonth存入农历1901年到2050年每年中的月天数信息
  * 农历每月只能是29或30天,一年用12(或13)个二进制位表示,从高到低,对应位为1表示30天,否则29天
  */
 var LunarDaysOfMonth = new Array
 (
	 0x4ae0, 0xa570, 0x5268, 0xd260, 0xd950, 0x6aa8, 0x56a0, 0x9ad0, 0x4ae8, 0x4ae0,   // 1901-1910   
	 0xa4d8, 0xa4d0, 0xd250, 0xd548, 0xb550, 0x56a0, 0x96d0, 0x95b0, 0x49b8, 0x49b0,   // 1920   
	 0xa4b0, 0xb258, 0x6a50, 0x6d40, 0xada8, 0x2b60, 0x9570, 0x4978, 0x4970, 0x64b0,   // 1930   
	 0xd4a0, 0xea50, 0x6d48, 0x5ad0, 0x2b60, 0x9370, 0x92e0, 0xc968, 0xc950, 0xd4a0,   // 1940   
	 0xda50, 0xb550, 0x56a0, 0xaad8, 0x25d0, 0x92d0, 0xc958, 0xa950, 0xb4a8, 0x6ca0,   // 1950   
	 0xb550, 0x55a8, 0x4da0, 0xa5b0, 0x52b8, 0x52b0, 0xa950, 0xe950, 0x6aa0, 0xad50,   // 1960   
	 0xab50, 0x4b60, 0xa570, 0xa570, 0x5260, 0xe930, 0xd950, 0x5aa8, 0x56a0, 0x96d0,   // 1970   
	 0x4ae8, 0x4ad0, 0xa4d0, 0xd268, 0xd250, 0xd528, 0xb540, 0xb6a0, 0x96d0, 0x95b0,   // 1980   
	 0x49b0, 0xa4b8, 0xa4b0, 0xb258, 0x6a50, 0x6d40, 0xada0, 0xab60, 0x9370, 0x4978,   // 1990   
	 0x4970, 0x64b0, 0x6a50, 0xea50, 0x6b28, 0x5ac0, 0xab60, 0x9368, 0x92e0, 0xc960,   // 2000 
	 0xd4a8, 0xd4a0, 0xda50, 0x5aa8, 0x56a0, 0xaad8, 0x25d0, 0x92d0, 0xc958, 0xa950,	  // 2001-2010 
	 0xb4a0, 0xb550, 0xb550, 0x55a8, 0x4ba0, 0xa5b0, 0x52b8, 0x52b0, 0xa930, 0x74a8,   // 2011-2020 
	 0x6aa0, 0xad50, 0x4da8, 0x4b60, 0x9570, 0xa4e0, 0xd260, 0xe930, 0xd530, 0x5aa0,	  // 2021-2030 
	 0x6b50, 0x96d0, 0x4ae8, 0x4ad0, 0xa4d0, 0xd258, 0xd250, 0xd520, 0xdaa0, 0xb5a0,	  // 2031-2040 
	 0x56d0, 0x4ad8, 0x49b0, 0xa4b8, 0xa4b0, 0xaa50, 0xb528, 0x6d20, 0xada0, 0x55b0	  // 2041-2050 
 );
/**
*	数组LunarLeapYear存放农历1901年到2050年闰月的月份,如没有则为0,从高到低,每字节存两年
*/
var LunarLeapYear = new Array
 (
	 0x00, 0x50, 0x04, 0x00, 0x20,   // 1901-1910   
	 0x60, 0x05, 0x00, 0x20, 0x70,   // 1920   
	 0x05, 0x00, 0x40, 0x02, 0x06,   // 1930   
	 0x00, 0x50, 0x03, 0x07, 0x00,   // 1940   
	 0x60, 0x04, 0x00, 0x20, 0x70,   // 1950   
	 0x05, 0x00, 0x30, 0x80, 0x06,   // 1960   
	 0x00, 0x40, 0x03, 0x07, 0x00,   // 1970   
	 0x50, 0x04, 0x08, 0x00, 0x60,   // 1980   
	 0x04, 0x0a, 0x00, 0x60, 0x05,   // 1990   
	 0x00, 0x30, 0x80, 0x05, 0x00,   // 2000
	 0x40, 0x02, 0x07, 0x00, 0x50,	// 2001-2010 
	 0x04, 0x09, 0x00, 0x60, 0x04,	// 2011-2020 
	 0x00, 0x20, 0x60, 0x05, 0x00,	// 2021-2030 
	 0x30, 0xb0, 0x06, 0x00, 0x50,	// 2031-2040 
	 0x02, 0x07, 0x00, 0x50, 0x03	// 2041-2050 
 );

/**
* 日期转换
* 使用方法
* var dc = new dateChange();
* var a=dc.getSolarDate([2005,1,10]);	//农历转公历
* var b=dc.getLunarDate([2005,1,10]); //公历转农历
*/
// function dateChange() {
   
 /**
   * 返回农历iLunarYear年的闰月月份,如没有则返回0 
   */
 function GetLeapMonth(iLunarYear) {
   
	 var Leap = LunarLeapYear[(iLunarYear - 1901) >> 1];
	 return (((iLunarYear - 1901) & 1) == 0) ? (Leap >> 4) : (Leap & 0x0f);
 }
 /**
   * 返回农历iLunarYer年iLunarMonth月的天数,结果是一个长整数
   * 如果iLunarMonth不是闰月, 高字为0,低字为该月的天数
   * 如果iLunarMonth是闰月, 高字为后一个月的天数,低字为前一个月的天数
   */
 function LunarMonthDays(iLunarYear, iLunarMonth) {
   
	 var High;
	 var Low;
	 var Bit;

	 High = 0;
	 Low = 29;
	 Bit = 16 - iLunarMonth;
	 if ((iLunarMonth > GetLeapMonth(iLunarYear)) && (GetLeapMonth(iLunarYear) > 0)) Bit--;
	 if ((LunarDaysOfMonth[iLunarYear - 1901] & (1 << Bit)) > 0) Low++;
	 if (iLunarMonth == GetLeapMonth(iLunarYear)) {
   
		 High = ((LunarDaysOfMonth[iLunarYear - 1901] & (1 << (Bit - 1))) &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值