vue实现农历日期选择器

2023-11-08

在项目中会员进行注册的时候需要进行生日的选择,由于通用的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))) > 0) ? 30 : 29;
	 }
	 return Low + (High << 16);
 }
 /**
   * 返回公历iSolarYear年iSolarMonth月的天数,结果是一个长整数
   */
 function SolarMonthDays(iSolarYear, iSolarMonth) {
	 var MonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
	 var isl = isLeapYear(iSolarYear);
	 if (isl) MonthDays[1] = 29;
	 return MonthDays[iSolarMonth - 1];
 }
 /**
   * 返回农历iLunarYear年的总天数
   */
 function LunarYearDays(iLunarYear) {
	 var Days;
	 var tmp;

	 Days = 0;
	 for (var i = 1; i <= 12; i++) {
		 tmp = LunarMonthDays(iLunarYear, i);
		 Days = Days + ((tmp >> 16) & 0xffff); //取高位 
		 Days = Days + (tmp & 0xffff); //取低位 
	 }
	 return Days;
 }
 /**
   * 返回公历iSolarYear年的总天数
   */
 function SolarYearDays(iSolarYear) {
	 var isl = isLeapYear(iSolarYear);
	 return isl ? 366 : 365;
 }
 /**
   * 判断公历年是否是润年
   */
 function isLeapYear(iSolarYear) {
	 var y = parseInt(iSolarYear);
	 return ((y % 100 == 0 && y % 400 == 0) || (y % 4 == 0 & y % 100 != 0));
 }
 /**
   * 将农历iLunarYear年格式化成天干地支记年法表示的字符串 
   */
 function FormatLunarYear(iLunarYear) {
	 var szText1 = new String("甲乙丙丁戊己庚辛壬癸");
	 var szText2 = new String("子丑寅卯辰巳午未申酉戌亥");
	 var strYear;
	 strYear = szText1.substr((iLunarYear - 4) % 10, 1);
	 strYear = strYear + szText2.substr((iLunarYear - 4) % 12, 1);
	 return strYear + "年";
 }
 /**
   * 将农历iLunarMonth月格式化成农历表示的字符串
   */
 function FormatLunarMonth(iLunarMonth) {
	 var szText = new String("正二三四五六七八九十");
	 var strMonth;

	 if (iLunarMonth <= 10) {
		 strMonth = szText.substr(iLunarMonth - 1, 1);
	 }
	 else if (iLunarMonth == 11) strMonth = "冬";
	 else strMonth = "腊";

	 return strMonth + "月";
 }
 /**
   * 将农历iLunarDay日格式化成农历表示的字符串
   */
 function FormatLunarDay(iLunarDay) {
	 var szText1 = new String("初十廿三");
	 var szText2 = new String("一二三四五六七八九十");
	 var strDay;
	 if ((iLunarDay != 20) && (iLunarDay != 30)) {
		 strDay = szText1.substr((iLunarDay - 1) / 10, 1) + szText2.substr((iLunarDay - 1) % 10, 1);
	 }
	 else if (iLunarDay != 20) {
		 strDay = szText1.substr(iLunarDay / 10, 1) + "十";
	 }
	 else {
		 strDay = "二十";
	 }

	 return strDay;
 }
 /**
   * 计算两个公历日期相差的天数
   */
 function CaculateSolarSpanDays(start, end) {
	 var starty = start[0];
	 var startm = start[1];
	 var startd = start[2];
	 var endy = end[0];
	 var endm = end[1];
	 var endd = end[2];
	 var daynum = 0;

	 //年份的天数
	 for (var i = starty; i < endy; i++) {
		 daynum += SolarYearDays(i);
	 }
	 //月份的天数
	 for (var i = 1; i < endm; i++) {
		 daynum += SolarMonthDays(endy, i);
	 }
	 daynum += endd - startd;
	 return daynum;
 }
 /**
   * 计算两个农历日期相差的天数
   * isleap--> end的月份是闰月还是非闰月
   */
 function CaculateLunarSpanDays(start, end, isleap) {
	 var starty = start[0];
	 var startm = start[1];
	 var startd = start[2];
	 var endy = end[0];
	 var endm = end[1];
	 var endd = end[2];
	 var daynum = 0;

	 //年份的天数
	 for (var i = starty; i < endy; i++) {
		 daynum += LunarYearDays(i);
	 }
	 //月份的天数
	 for (var i = 1; i < endm; i++) {
		 var mdays = 0;
		 var tmp = LunarMonthDays(endy, i);
		 mdays += ((tmp >> 16) & 0xffff); //取高位 
		 mdays += (tmp & 0xffff); //取低位 
		 daynum += mdays;
		 //w('lunar'+endy+'年'+i+'月的天数为'+ LunarMonthDays(endy,i));
	 }
	 //如果当前月是闰月,加上当前月的非闰月天数
	 if (isleap) {
		 var Low;
		 var Bit;
		 Low = 29;
		 Bit = 16 - endm;
		 if ((endm > GetLeapMonth(endy)) && (GetLeapMonth(endy) > 0)) Bit--;
		 if ((LunarDaysOfMonth[endy - 1901] & (1 << Bit)) > 0) Low++;
		 daynum += Low;
	 }
	 daynum += endd - startd;
	 return daynum;
 }
 /**
   * 将公历日期转换为农历日期,返回农历表示的字符串
   */
 function GetLunarDateString(SolarDate) {
	 var tmp;
	 var iLunarYear;
	 var iLunarMonth;
	 var iLunarDay;
	 var Leap = false;
	 var MinMilli = 1000 * 60;
	 var HrMilli = MinMilli * 60;
	 var DyMilli = HrMilli * 24;

	 /* 从1901年1月1日算起,给定的公历日期已经过去的天数
		Date是从1970年1月1日作为起点的	*/
	 var StartDate = [1901, 1, 1];
	 var iSpanDays = CaculateSolarSpanDays(StartDate, SolarDate);
	 //w('公历'+StartDate+'至'+SolarDate+'的总天数:'+iSpanDays);

	 // 公历1901年2月19日为农历1901年正月初一,差49天
	 if (iSpanDays <= 18) {
		 iLunarYear = 1900;
		 iLunarMonth = 11;
		 iLunarDay = 11 + iSpanDays;
	 }
	 else if (iSpanDays > 18 && iSpanDays < 49) {
		 iLunarYear = 1900;
		 iLunarMonth = 12;
		 iLunarDay = iSpanDays - 18;
	 }
	 else {
		 // 从农历1901年正月初一算起 
		 iSpanDays = iSpanDays - 49;
		 iLunarYear = 1901;
		 iLunarMonth = 1;
		 iLunarDay = 1;

		 // 计算农历年 
		 tmp = LunarYearDays(iLunarYear);
		 while (iSpanDays >= tmp) {
			 iSpanDays -= tmp;
			 iLunarYear++;
			 tmp = LunarYearDays(iLunarYear);
			 //w(iLunarYear + '总天数' + tmp + '  减后剩余天数:' +iSpanDays);
		 }
		 //w('年--'+iLunarYear);

		 // 计算农历月 
		 tmp = LunarMonthDays(iLunarYear, iLunarMonth) & 0xffff; //取低字
		 while (iSpanDays >= tmp) {
			 iSpanDays -= tmp;
			 if (iLunarMonth == GetLeapMonth(iLunarYear))  // 该年该月闰月
			 {
				 tmp = LunarMonthDays(iLunarYear, iLunarMonth) >> 16; //取高字
				 if (iSpanDays < tmp) {
					 Leap = (tmp > 0) ? true : false;  // 闰月的后个月?
					 break;
				 }
				 iSpanDays = iSpanDays - tmp;
			 }

			 iLunarMonth++;
			 tmp = LunarMonthDays(iLunarYear, iLunarMonth) & 0xffff; //取低字
		 }

		 // 计算农历日 
		 iLunarDay += iSpanDays;
	 }
	 return [iLunarYear, (Leap ? iLunarMonth * 10 : iLunarMonth), iLunarDay, FormatLunarYear(iLunarYear) + '(' + iLunarYear + ')', (Leap ? "闰" : "") + FormatLunarMonth(iLunarMonth), FormatLunarDay(iLunarDay), 'fromSolarDay' + SolarDate];
	 //return FormatLunarYear(iLunarYear) + (Leap ? "闰" : "") + FormatLunarMonth(iLunarMonth) + FormatLunarDay(iLunarDay);
 }
 /**
   * 将农历日期转换为公历日期
   */
 function GetSolarDateString(LunarDate) {
	 var tmp;
	 var iSolarYear;
	 var iSolarMonth;
	 var iSolarDay;
	 var Leap = false;
	 var MinMilli = 1000 * 60;
	 var HrMilli = MinMilli * 60;
	 var DyMilli = HrMilli * 24;

	 //判断LunarDate的月份是否属于闰月, 例 4为非闰月 40为闰月.
	 var monthIsLeap = false;
	 if (LunarDate[1] > 12) {
		 monthIsLeap = true;
		 LunarDate[1] = LunarDate[1] / 10;
	 }
	 if (LunarDate[0] < 1900) {
		 alert('超出计算范围0');
		 return false;
	 }

	 // 从1900年冬月十一(公历1901年1月1日)算起,给定的农历日期已经过去的天数	
	 // 公历1901年2月19日为农历1901年正月初一,差49天
	 // 公历1901年1月1日为农历1900年11月11,差49天
	 var StartDate = [1901, 1, 1];
	 if (LunarDate[0] == 1900) {
		 if (LunarDate[1] == 11) {
			 var iSpanDays = LunarDate[2] - 11;
		 } else if (LunarDate[1] == 12) {
			 var iSpanDays = LunarDate[2] + 18;
		 } else {
			 alert('超出计算范围');
			 return false;
		 }
	 } else {
		 var iSpanDays = CaculateLunarSpanDays(StartDate, LunarDate, monthIsLeap) + 49;
	 }
	 //w('1900年冬月十一 至 '+LunarDate+'的总天数:'+iSpanDays);	

	 // 从公历1901年1月1日算起 	
	 iSolarYear = 1901;
	 iSolarMonth = 1;
	 iSolarDay = 1;

	 // 计算公历年 
	 tmp = SolarYearDays(iSolarYear);
	 //w(iSolarYear+'年'+'的总天数:'+tmp);
	 while (iSpanDays >= tmp) {
		 iSpanDays -= tmp;
		 iSolarYear++;
		 tmp = SolarYearDays(iSolarYear);
		 //w(iSolarYear+'年'+'的总天数:'+tmp);
	 }
	 //w('计算公历年后剩余天数:'+iSpanDays);

	 // 计算公历月 
	 tmp = SolarMonthDays(iSolarYear, iSolarMonth);
	 //w(iSolarYear+'年'+iSolarMonth+'月'+'的天数:'+tmp);
	 while (iSpanDays >= tmp) {
		 iSpanDays -= tmp;
		 iSolarMonth++;
		 tmp = SolarMonthDays(iSolarYear, iSolarMonth);
		 //w(iSolarYear+'年'+iSolarMonth+'月'+'的天数:'+tmp + ' 减后:'+iSpanDays);
	 }
	 //w('计算月后剩余天数:'+iSpanDays);

	 // 计算公历日 
	 iSolarDay += iSpanDays;
	 return [iSolarYear, iSolarMonth, iSolarDay, iSolarYear + '年', iSolarMonth + '月', iSolarDay + '日', 'fromLunarDays' + LunarDate];
 }
export  {GetLunarDateString,GetSolarDateString,SolarYearDays,SolarMonthDays,LunarYearDays,LunarMonthDays,GetLeapMonth,FormatLunarMonth,FormatLunarDay,FormatLunarYear}

组件封装

<template>
  <div>
    <div class="btn">
      <div class="btn_left" @click="err">取消</div>
      <div class="btn_right" @click="send">确定</div>
    </div>
    <div class="select">
      <div>
        <select name id @change="lunary" ref="lunary" class="select_y" size="5">
          <option v-for="(item,index) in ylist" :key="index" selected>{{item}}</option>
        </select>
      </div>
      <div>
        <select name id @change="lunarm" ref="lunarm" class="select_m" size="5">
          <option v-for="(item,index) in mlist" :key="index">{{item}}</option>
        </select>
      </div>
      <div>
        <select name id @change="lunard" ref="lunard" class="select_d" size="5">
          <option v-for="(item,index) in dlist" :key="index">{{item}}</option>
        </select>
      </div>
    </div>
  </div>
</template>
<script>
import {
  GetLunarDateString,
  GetSolarDateString,
  SolarYearDays,
  SolarMonthDays,
  LunarYearDays,
  LunarMonthDays,
  GetLeapMonth,
  FormatLunarMonth,
  FormatLunarDay,
  FormatLunarYear
} from "./lucnDate.js";
import { stringify } from "querystring";
import { nextTick } from "q";
export default {
  data() {
    return {
      ylist: null,
      mlist: null,
      dlist: null,
      data: {}
    };
  },
  methods: {
    // 取消
    err() {
      // 向父组件传值
      this.$emit("func", this.data);
    },
    // 确认
    send() {
      if (
        this.$refs.lunary.value &&
        this.$refs.lunarm.value &&
        this.$refs.lunard.value
      ) {
        console.log(this.$refs.lunard.selectedIndex);
        this.data = {
          lunary: this.$refs.lunary.value,
          lunarm: this.$refs.lunarm.value,
          lunard: this.$refs.lunard.value,
          dindex: this.$refs.lunard.selectedIndex + 1
        };
        this.$emit("func", this.data);
      } else {
        this.$toast({
          message: "请选择生日",
          duration: 1000
        });
      }
    },
    // 年
    lunary() {
      this.mlist = this.lunarMonthOptions(this.$refs.lunary.value);
      console.log(this.lunarMonthOptions(this.$refs.lunary.value));
      // 从新选择年再次计算
      this.lunarm();
    },
    // 月
    lunarm() {
      console.log(this.$refs.lunarm.value);
      // 将农历月转化为公历月
      var disLength = this.$refs.lunarm.value.length;
        var shortName = this.$refs.lunarm.value.substring(disLength - 2, disLength);
        console.log(shortName);
        switch (shortName) {
          case "正月":
            this.m = 1;
            break;
          case "二月":
            this.m = 2;
            break;
          case "三月":
            this.m = 3;
            break;
          case "四月":
            this.m = 4;
            break;
          case "五月":
            this.m = 5;
            break;
          case "六月":
            this.m = 6;
            break;
          case "七月":
            this.m = 7;
            break;
          case "八月":
            this.m = 8;
            break;
          case "九月":
            this.m = 9;
            break;
          case "十月":
            this.m = 10;
            break;
          case "冬月":
            this.m = 11;
            break;
          case "腊月":
            this.m = 12;
            break;
          default:
        }
      // 输入当年当月的天数
      this.dlist =  this.lunarDayOptions(this.$refs.lunary.value, this.m);
    },
    // 天
    lunard() {
      //$("select").on("blur", function() {
      //  window.scroll(0, 0); //失焦后强制让页面归位
      //});
    },
    // 循环年
    lunarYearOptions(from, to, curyear) {
      var str = [];
      for (var i = from; i <= to; i++) {
        str.push(i);
        // str.push(FormatLunarYear(i) + "(" + i + ")");
      }
      return str;
    },
    // 循环月
    lunarMonthOptions(year, month) {
      var leapMonth = GetLeapMonth(year);
      var str = [];
      var from = 1;
      var to = 12;

      var leap = false;
      if (month > 12) {
        leap = true;
        month = month / 10;
      }
      for (var i = from; i <= to; i++) {
        str.push(FormatLunarMonth(i));
        if (leapMonth > 0 && i == leapMonth) {
          str.push("闰" + FormatLunarMonth(i));
        }
      }
      return str;
    },
    // 循环天
    lunarDayOptions(year, month, day) {
      console.log(year, month, day)
      var from = 1;
      var to = 0;
      var leap = false;
      if (month > 12) {
        month = month / 10;
        leap = true;
        var monthdaynum = (LunarMonthDays(year, month) >> 16) & 0xffff;
      } else {
        var monthdaynum = LunarMonthDays(year, month) & 0xffff;
      }
      to = monthdaynum;
      console.log(to)
      var str = [];
      for (var i = from; i <= to; i++) {
        str.push(FormatLunarDay(i));
      }
      return str;
    }
  },
  mounted() {
    // //设定当前农历公历日期
    var curSolarDate = [2019, 11, 4];
    // 年,月,日
    var curLunarDate = GetSolarDateString(curSolarDate);
    this.ylist = this.lunarYearOptions(1902, 2019, curLunarDate[0]);
    this.mlist = this.lunarMonthOptions(
      curLunarDate[0],
      curLunarDate[1],
      curLunarDate[2]
    );
  }
};
</script>
<style scoped>
.btn {
  height: 0.3rem;
  line-height: 1rem;
  font-size: 0.29rem;
}
.btn_left {
  float: left;
  padding-left: 0.1rem;
  color: #1989fa;
}
.btn_right {
  float: right;
  padding-right: 0.1rem;
  color: #1989fa;
}
.select {
  margin-top: 1rem;
  width: 100%;
  /* text-align: center; */
  display: flex;
  justify-content: space-around;
  overflow-y: hidden;
}
.select_y option {
  /* width: 33%; */
  /*去掉默认的下拉三角*/
  /* appearance: none; */
  height: 0.7rem;
  padding: 0.2rem 0;
}
.select_m option {
  /* width: 33%; */
  height: 0.7rem;
  padding: 0.2rem 0;
}
.select_d option {
  /* width: 33%; */
  height: 0.7rem;
  padding: 0.2rem 0;
}
</style>>

在父组件中的使用

      <van-popup v-else v-model="show" position="bottom" :style="{ height: '40%' }">
        <nongli @func="getMsgFormSon"></nongli>
      </van-popup>
//这里在对农历进行了转换方便后台的存储
getMsgFormSon(data) {
      if (Object.keys(data).length !== 0) {
        var disLength = data.lunarm.length;
        var shortName = data.lunarm.substring(disLength - 2, disLength);
        console.log(shortName);
        switch (shortName) {
          case "正月":
            this.m = 1;
            break;
          case "二月":
            this.m = 2;
            break;
          case "三月":
            this.m = 3;
            break;
          case "四月":
            this.m = 4;
            break;
          case "五月":
            this.m = 5;
            break;
          case "六月":
            this.m = 6;
            break;
          case "七月":
            this.m = 7;
            break;
          case "八月":
            this.m = 8;
            break;
          case "九月":
            this.m = 9;
            break;
          case "十月":
            this.m = 10;
            break;
          case "冬月":
            this.m = 11;
            break;
          case "腊月":
            this.m = 12;
            break;
          default:
        }
        this.y = data.lunary;
        this.dindex = data.dindex + 1;
        var time = this.y + "-" + this.m + "-" + this.dindex;
        this.BirthdaySR = dayjs(time).format("YYYY-MM-DD");
        this.userInfo.BirthdaySR = this.BirthdaySR + " " + "23:59:00";
        this.show = false;
        console.log(this.y + "-" + this.m + "-" + this.d);
      } else {
        this.show = false;
      }
    },

到此整个农历日期选择器基本实现,剩下的就是一些对样式的修改和调整。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue实现农历日期选择器 的相关文章

  • 关于ElementUI 项目开发的eslint 报错问题的修复

    介绍 使用操作系统为 Win11Win11 使用教程 1 使用 ElementUI 项目进行开发时因为各自的格式化文档不同难免会遇到各种报错 但是大部分都是因为 单引 分号 逗号 的格式存在报错 2 这时我们在项目的根目录下可以新建一个 p
  • 赛元SC92F7250单片机开发

    文章目录 芯片简介 开发环境 安装Keil C51 安装SOC Keil插件 配置Keil环境 基本功能开发 gpio操作 外部中断 定时器 看门狗 EEPROM 注意事项 芯片简介 赛元SC92F7250单片机 是国产的超低成本选择 对于
  • Android 手机影音 开发过程记录(四)

    前一篇已经将视频播放页面的布局弄好了 这一篇主要来处理播放页面的各种逻辑 播放 暂停 上 下一个视频 音量 进度 逻辑比较多 一点一点贴代码 顶部布局的逻辑 显示系统时间 时间是一秒一秒更新的 所以可以通过循环发消息的方法来更新系统时间 相
  • 开发参考资料

    一 开发环境 Ubuntu gt 20 04 x64 arm64 Visual Studio gt 2019 二 参考资料 OpenCV 官方文档 https opencv org releases Qt6 下载地址 https mirro
  • 线程诊断,找到cpu占用高的原因

    使用 top 命令 找到cpu占用率最高的进程pid 2 输入 ps H eo pid tid cpu grep 进程pid 由上图可以发现 占用率最高的pid为32655 找到占用率最高的线程 为32655 要换算成16进制为7f99 3
  • 【Redis】高并发下缓存穿透缓存雪崩解决方案

    高并发下缓存穿透缓存雪崩解决方案 高并发下缓存穿透 缓存雪崩的解决方案 缓存穿透及其解决方案 缓存雪崩及其解决方案 使用双重检查锁需要注意的点 高并发下缓存穿透 缓存雪崩的解决方案 缓存穿透及其解决方案 缓存穿透指的是在缓存系统中请求一个不
  • SGL基本思路讲解

    SGL图形库是为Windows图形界面编程服务的 而且一切都是考虑到对新手友好的 在具体介绍提供给用户的函数之前 需要先说明一下应该以什么样的思路来构思我们的SGL程序 作为C语言程序 main函数总是需要在最开始就了解一下的 在SGL库中
  • 手把手带你打造自己的UI样式库(第三章)之常用样式组件的设计与开发

    常用样式组件的设计与开发 Search搜索框样式的设计与开发 搜索组件的需求 搜索框的功能比较简单 最基本的就是输入和提交两个逻辑 但是我们这个搜索框要额外的加一些细节 输入框分为输入状态和非输入状态 两种状态下输入框表现要有所不同 我们对
  • 在vue路由跳转时神奇的更改页面title

    一 router中增加title 二 在入口文件中进行判断
  • 小程序中关于红包雨的实现

    一 原型依据 在我这个项目中小程序端所需要实现的只有红包雨的下落动画和通屏背景图的兼容 关于红包点击金额的计算是由后端实现的 首先来看下需要实现的效果图 二 实现代码 首先是第一次进入的页面 在这个页面的时候会进行静默登录 静默登录成功的话
  • 保持websocket长时间连接永不断开

    1 定期发送心跳包 ping pong 客户端和服务器端都需要定期发送ping消息 并相应得到pong消息 以确保连接仍然正常 如果超过一定时间没收到pong 需要主动关闭连接 JS客户端代码 定期发送ping setInterval gt
  • 本地HTML访问后端获取数据使用@CrossOrigin仍出现跨域问题

    Access to XMLHttpRequest at http localhost api admin authorizations from origin http localhost 9528 has been blocked by
  • 新手注意事项-visual studio 来实现别踩白块儿

    自己之前为了熟悉easyx练习过一个简单的项目 别踩白块儿 链接在这里 别踩白块儿 当时比较稚嫩 很多东西都不会 可以说是只知道最基本的语法 头文件都不知道 一个一个查资料弄懂的 还是比较艰难哈哈 今天想着重新打开一下那个项目 结果运行错误
  • 云服务器配置域名直接访问项目

    我使用的是阿里云服务器和域名 关于云服务器和域名的购买就不一一赘述了 主要讲解云服务器配置域名及使用域名访问项目 一 云服务器配置域名 1 在云服务器 ECS中搜索域名 找到域名控制台点进去 2 进去域名列表页面 然后点击域名后面的 解析
  • excludePathPatterns方法不生效

    1 场景 我在项目中配置了License证书授权的功能 然后在配置拦截器的时候拦截了所有的请求都必须验证License是否到期 但是这样会导致接口响应慢 所以打算使用 excludePathPatterns 方法对部分url请求放行 例如我
  • 微信小程序中实现车牌输入功能

    一 成品展示与介绍 在点击输入框的时候会弹出车牌输入键盘 二 相关思路解析 首先车牌号码由31位汉字 26位字母 10位数字组成的 开头第一位由省份简称的汉字 第二位字母根据省份下的城市或地区区分 最后的五位或者六位 是有字母和数字组成的
  • 小程序的开发之使用SVG

    昨天突然提出要在小程序中使用SVG 因为我们的小程序项目是有主题色的 不同的主题色时有些图片一直是固定的 显的有些格格不入 所以打算使用SVG来实现根据主题色的颜色进行变化 什么是SVG SVG是 Scalable Vector Graph
  • 手把手带你打造自己的UI样式库(第五章)之常用页面切图的设计与开发

    常用页面切图的设计与开发 在一些大的前端团队中 前端工程师这个职位会出现一个分支 叫做重构工程师 重构工程师主要负责 HTML 和 CSS 的制作 也就是把设计稿转换成 HTML 和 CSS 代码 重构工作完成以后 把制作好的 HTML 和
  • 【Unity】Delegate, Event, UnityEvent, Action, UnityAction, Func 傻傻分不清

    Unity Delegate Event UnityEvent Action UnityAction Func 傻傻分不清 Delegate 委托 函数指针 一个简单的例子 一对一依赖 一个简单的例子 一对多依赖 所以话说 委托有啥用呢 事
  • Eclipse android apk打包

    Eclipse android 开发更改apk名字 有以下几步 第一步 修改工程包名 在eclipse里 找到项目包和java包 原则上都一样 就可以按 F2 修改名字 随之 源 java也会得到相应的修改 然而每个 java文件都需要把如

随机推荐

  • PHP 的Laravel 框架

    在windows下 搭建PHP的Laravel框架很简单 先把PHP的安装目录 加入到环境变量里 在命令行能访问到php v 就说明可以了 然后 这些是需求的环境 PHP gt 7 1 3 不用说了 OpenSSL PHP扩展 用compo
  • 51单片机编写60秒倒计时程序

    include
  • linux下mysql安装

    一 解压缩mysql 5 6 4 m7 tar zip 1 gt unzip mysql 5 6 4 m7 tar zip 会生成mysql 5 6 4 m7 tar gz的压缩文件 2 gt tar zxvf mysql 5 6 4 m7
  • mysqlbinlog命令使用

    参考 https www cnblogs com zouhong p 14540380 html https www iteye com blog wx1568934009 2469938 获取二进制日志列表show binary logs
  • Shell Script—线程

    本文主要介绍shell中的线程 线程中的等待和信号 1 线程 Shell中线程的实现有多种方式 目前只介绍通过 符号 通过在命令末尾加上 符号 可以在后台启动一个进程并立即返回 允许Shell进程继续执行其他命令 示例 bin bash N
  • 023.二叉树的最近公共祖先

    题目链接 236 二叉树的最近公共祖先 大概思路 题目要求 给定一个二叉树 找到该树中两个指定节点q p的最近公共祖先x q p一定存在且值不同 最近公共祖先 两个节点共同的祖先 同时深度尽可能大 其中一个可以是祖先本身 思路 q p的最近
  • 作业asd

    餐馆 class Restaurant def init self restaurant name cuisine type self restaurant name restaurant name self cuisine type cu
  • UI设计基础知识点之Android设计规范篇

    目录 基础概念 Android界面设计规范 Android切图标注 安卓开发单位换算 总结 一 基础概念 1 什么是DPI DPI Dots Per Inch 每英寸点数 表示指屏幕密度 是测量空间点密度的单位 最初应用于打印技术中 它表示
  • 杂项:art-template-loader

    ylbtech 杂项 art template loader 1 返回顶部 2 返回顶部 3 返回顶部 4 返回顶部 5 返回顶部 1 https www npmjs com package art template loader 2 ht
  • Vivado中怎么做set_input_delay约束

    参考 https forums xilinx com t5 Timing Analysis Hold violation in ISERDES td p 715121 前言 在STA中 要分析上游器件和FPGA之间的时序关系就得指定inpu
  • VSCode+arm-none-eabi+msys使用Make实现STM32交叉编译

    记录一下在Windows平台下 利用VSCode的arm none eabi扩展和msys使用Make实现STM32的交叉编译 准备 1 安装arm none eabi扩展 在VSCode的扩展窗口 搜索eabi 安装windows arm
  • 解决HttpClient工具中application/x-www-form-urlencoded表单提交时,请求参数中文乱码问题

    一 参数乱码现象 当我去请求第三方接口时 接口接收格式为Form表单的时候 使用HttpClient工具类 这时 对于封装进HttpPost对象里的请求参数 如果有中文参数 会出现乱码的现象 二 代码现象复现 controller层 Res
  • c语言中\n,\t,\r,\b的用法和区别

    1 n 最容易理解 就是 换行 跳到下一行的起始位置 2 t 也容易理解 即跳到下一制表位 举例如下图所示 3 r 回车 不换行 r后边的数字替代 这一行最开始的相等数目的数字 举例 4 b 退格 也就是电脑键盘上的backspace b后
  • python pip命令安装 pyinstaller失败提示Installing build dependencies ... error

    1 现象 2 解决方案 自己下载 手动安装 2 1 下载地址 https pypi org project PyInstaller 3 5 files 2 2 解压到E python PyInstaller 3 5 2 3 cmd进入到解压
  • 差分信号简述

    差分信号是一种信号传输技术 传统的传输方法使用一根信号线传输信号 一根地线接地 差分信号需要在两根线上都传输信号 且两个信号振幅相同 相位相反 这样的信号就是差分信号 使用差分信号传输的好处是 只要传输正负信号的两根线在物理上是紧密耦合在一
  • echart柱状图Y轴最小间隔问题,Y轴不显示小数

    今天来说说echart 柱状图 Y轴的最小值 间隔问题 最近项目中用到柱状图 数据量少的时候 Y轴会出现小数 但是我们产品小哥哥说不能出现小数 好了 那就开干 option xAxis type category data Mon Tue
  • Linux安装opencv(附带出错,解决方法参考)

    前言 lib库 运行库 dev库 开发 gdb库 调试 安装 1 1 OpenCV是一个开源的软件 在一个source文件下 包含了所有的源代码文件 使用哪种操作系统 windows还是linux 使用哪种编译器 注意 执行安装包很可能不仅
  • springmvc有哪几种请求参数的方式呢?

    转自 springmvc有哪几种请求参数的方式呢 传送参数至后台 是每个系统都必须面对的事实 因为系统就是一个实现人机交互的工具 那么Spring MVC中如何在后台获取参数呢 下文将一一道来 如下所示 方式一 在Controller的形参
  • LRC歌词解析,实现Linux设备播放音乐显示歌词 LRC解析

    开始正文 1 关于LRC lrc是英文lyric 歌词 的缩写 被用做歌词文件的扩展名 以lrc为扩展名的歌词文件可以在各类数码播放器中同步显示 LRC 歌词是一种包含着 形式的 标签 tag 的 基于纯文本的歌词专用格式 最早由郭祥祥先生
  • vue实现农历日期选择器

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