| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344 | <template>	<view class="w-picker-view">		<picker-view  class="d-picker-view" :indicator-style="itemHeight" :value="pickVal" @change="handlerChange">			<picker-view-column class="w-picker-flex2">				<view class="w-picker-item" v-for="(item,index) in range.fyears" :key="index">{{item}}年</view>			</picker-view-column>			<picker-view-column class="w-picker-flex2">				<view class="w-picker-item" v-for="(item,index) in range.fmonths" :key="index">{{item}}月</view>			</picker-view-column>			<picker-view-column class="w-picker-flex2">				<view class="w-picker-item" v-for="(item,index) in range.fdays" :key="index">{{item}}日</view>			</picker-view-column>			<picker-view-column class="w-picker-flex1">				<view class="w-picker-item">-</view>			</picker-view-column>			<picker-view-column class="w-picker-flex2">				<view class="w-picker-item" v-for="(item,index) in range.tyears" :key="index">{{item}}年</view>			</picker-view-column>			<picker-view-column class="w-picker-flex2">				<view class="w-picker-item" v-for="(item,index) in range.tmonths" :key="index">{{item}}月</view>			</picker-view-column>			<picker-view-column class="w-picker-flex2">				<view class="w-picker-item" v-for="(item,index) in range.tdays" :key="index">{{item}}日</view>			</picker-view-column>		</picker-view>	</view></template><script>	export default {		data() {			return {				pickVal:[],				range:{},				checkObj:{}			};		},		props:{			itemHeight:{				type:String,				default:"44px"			},			value:{				type:[String,Array],				default(){					return []				}			},			current:{//是否默认选中当前日期				type:Boolean,				default:false			},			startYear:{				type:[String,Number],				default:1970			},			endYear:{				type:[String,Number],				default:new Date().getFullYear()			}		},		watch:{			value(val){				this.initData();			}		},		created() {			this.initData();		},		methods:{			formatNum(n){				return (Number(n)<10?'0'+Number(n):Number(n)+'');			},			checkValue(value){				let strReg=/^\d{4}-\d{2}-\d{2}$/,example="2020-04-03";				if(!strReg.test(value[0])||!strReg.test(value[1])){					console.log(new Error("请传入与mode匹配的value值,例["+example+","+example+"]"))				}				return strReg.test(value[0])&&strReg.test(value[1]);			},			resetToData(fmonth,fday,tyear,tmonth){				let range=this.range;				let tmonths=[],tdays=[];				let yearFlag=tyear!=range.tyears[0];				let monthFlag=tyear!=range.tyears[0]||tmonth!=range.tmonths[0];				let ttotal=new Date(tyear,tmonth,0).getDate();				for(let i=yearFlag?1:fmonth*1;i<=12;i++){					tmonths.push(this.formatNum(i))				}				for(let i=monthFlag?1:fday*1;i<=ttotal;i++){					tdays.push(this.formatNum(i))				}				return{					tmonths,					tdays				}			},			resetData(fyear,fmonth,fday,tyear,tmonth){				let fyears=[],fmonths=[],fdays=[],tyears=[],tmonths=[],tdays=[];				let startYear=this.startYear;				let endYear=this.endYear;				let ftotal=new Date(fyear,fmonth,0).getDate();				let ttotal=new Date(tyear,tmonth,0).getDate();				for(let i=startYear*1;i<=endYear;i++){					fyears.push(this.formatNum(i))				}				for(let i=1;i<=12;i++){					fmonths.push(this.formatNum(i))				}				for(let i=1;i<=ftotal;i++){					fdays.push(this.formatNum(i))				}				for(let i=fyear*1;i<=endYear;i++){					tyears.push(this.formatNum(i))				}				for(let i=fmonth*1;i<=12;i++){					tmonths.push(this.formatNum(i))				}				for(let i=fday*1;i<=ttotal;i++){					tdays.push(this.formatNum(i))				}				return {					fyears,					fmonths,					fdays,					tyears,					tmonths,					tdays				}			},			getData(dVal){				let start=this.startYear*1;				let end=this.endYear*1;				let value=dVal;				let flag=this.current;				let aToday=new Date();				let tYear,tMonth,tDay,tHours,tMinutes,tSeconds,pickVal=[];				let initstartDate=new Date(start.toString());				let endDate=new Date(end.toString());				if(start>end){					initstartDate=new Date(end.toString());					endDate=new Date(start.toString());				};				let startYear=initstartDate.getFullYear();				let startMonth=initstartDate.getMonth()+1;				let endYear=endDate.getFullYear();				let fyears=[],fmonths=[],fdays=[],tyears=[],tmonths=[],tdays=[],returnArr=[],startDVal=[],endDVal=[];				let curMonth=flag?value[1]*1:(startDVal[1]*1+1);				let curMonth1=flag?value[5][1]*1:(value[5]*1+1);				let totalDays=new Date(value[0],value[1],0).getDate();				let totalDays1=new Date(value[4],value[5],0).getDate();				for(let s=startYear;s<=endYear;s++){					fyears.push(this.formatNum(s));				};				for(let m=1;m<=12;m++){					fmonths.push(this.formatNum(m));				};				for(let d=1;d<=totalDays;d++){					fdays.push(this.formatNum(d));				};				for(let s=value[0]*1;s<=endYear;s++){					tyears.push(this.formatNum(s));				};								if(value[4]*1>value[0]*1){					for(let m=1;m<=12;m++){						tmonths.push(this.formatNum(m));					};					for(let d=1;d<=totalDays1;d++){						tdays.push(this.formatNum(d));					};				}else{					for(let m=value[1]*1;m<=12;m++){						tmonths.push(this.formatNum(m));					};					for(let d=value[2]*1;d<=totalDays1;d++){						tdays.push(this.formatNum(d));					};				};								pickVal=[					fyears.indexOf(value[0])==-1?0:fyears.indexOf(value[0]),					fmonths.indexOf(value[1])==-1?0:fmonths.indexOf(value[1]),					fdays.indexOf(value[2])==-1?0:fdays.indexOf(value[2]),					0,					tyears.indexOf(value[4])==-1?0:tyears.indexOf(value[4]),					tmonths.indexOf(value[5])==-1?0:tmonths.indexOf(value[5]),					tdays.indexOf(value[6])==-1?0:tdays.indexOf(value[6])				];				return {					fyears,					fmonths,					fdays,					tyears,					tmonths,					tdays,					pickVal				}			},			getDval(){				let value=this.value;				let fields=this.fields;				let dVal=null;				let aDate=new Date();				let fyear=this.formatNum(aDate.getFullYear());				let fmonth=this.formatNum(aDate.getMonth()+1);				let fday=this.formatNum(aDate.getDate());				let tyear=this.formatNum(aDate.getFullYear());				let tmonth=this.formatNum(aDate.getMonth()+1);				let tday=this.formatNum(aDate.getDate());				if(value&&value.length>0){					let flag=this.checkValue(value);					if(!flag){						dVal=[fyear,fmonth,fday,"-",tyear,tmonth,tday]					}else{						dVal=[...value[0].split("-"),"-",...value[1].split("-")];					}				}else{					dVal=[fyear,fmonth,fday,"-",tyear,tmonth,tday]				}				return dVal;			},			initData(){				let range=[],pickVal=[];				let result="",full="",obj={};				let dVal=this.getDval();				let dateData=this.getData(dVal);				let fyears=[],fmonths=[],fdays=[],tyears=[],tmonths=[],tdays=[];				let fyear,fmonth,fday,tyear,tmonth,tday;				pickVal=dateData.pickVal;				fyears=dateData.fyears;				fmonths=dateData.fmonths;				fdays=dateData.fdays;				tyears=dateData.tyears;				tmonths=dateData.tmonths;				tdays=dateData.tdays;				range={					fyears,					fmonths,					fdays,					tyears,					tmonths,					tdays,				}				fyear=range.fyears[pickVal[0]];				fmonth=range.fmonths[pickVal[1]];				fday=range.fdays[pickVal[2]];				tyear=range.tyears[pickVal[4]];				tmonth=range.tmonths[pickVal[5]];				tday=range.tdays[pickVal[6]];				obj={					fyear,					fmonth,					fday,					tyear,					tmonth,					tday				}				result=`${fyear+'-'+fmonth+'-'+fday+'至'+tyear+'-'+tmonth+'-'+tday}`;				this.range=range;				this.checkObj=obj;				this.$nextTick(()=>{					this.pickVal=pickVal;				});				this.$emit("change",{					result:result,					value:result.split("至"),					obj:obj				})			},			handlerChange(e){				let arr=[...e.detail.value];				let result="",full="",obj={};				let year="",month="",day="",hour="",minute="",second="",note=[],province,city,area;				let checkObj=this.checkObj;				let days=[],months=[],endYears=[],endMonths=[],endDays=[],startDays=[];				let mode=this.mode;				let col1,col2,col3,d,a,h,m;				let xDate=new Date().getTime();				let range=this.range;				let fyear=range.fyears[arr[0]]||range.fyears[range.fyears.length-1];				let fmonth=range.fmonths[arr[1]]||range.fmonths[range.fmonths.length-1];				let fday=range.fdays[arr[2]]||range.fdays[range.fdays.length-1];				let tyear=range.tyears[arr[4]]||range.tyears[range.tyears.length-1];				let tmonth=range.tmonths[arr[5]]||range.tmonths[range.tmonths.length-1];				let tday=range.tdays[arr[6]]||range.tdays[range.tdays.length-1];				let resetData=this.resetData(fyear,fmonth,fday,tyear,tmonth);				if(fyear!=checkObj.fyear||fmonth!=checkObj.fmonth||fday!=checkObj.fday){					arr[4]=0;					arr[5]=0;					arr[6]=0;					range.tyears=resetData.tyears;					range.tmonths=resetData.tmonths;					range.tdays=resetData.tdays;					tyear=range.tyears[0];					checkObj.tyears=range.tyears[0];					tmonth=range.tmonths[0];					checkObj.tmonths=range.tmonths[0];					tday=range.tdays[0];					checkObj.tdays=range.tdays[0];				}				if(fyear!=checkObj.fyear||fmonth!=checkObj.fmonth){					range.fdays=resetData.fdays;				};				if(tyear!=checkObj.tyear){					arr[5]=0;					arr[6]=0;					let toData=this.resetToData(fmonth,fday,tyear,tmonth);					range.tmonths=toData.tmonths;					range.tdays=toData.tdays;					tmonth=range.tmonths[0];					checkObj.tmonths=range.tmonths[0];					tday=range.tdays[0];					checkObj.tdays=range.tdays[0];				};				if(tmonth!=checkObj.tmonth){					arr[6]=0;					let toData=this.resetToData(fmonth,fday,tyear,tmonth);					range.tdays=toData.tdays;					tday=range.tdays[0];					checkObj.tdays=range.tdays[0];				};				result=`${fyear+'-'+fmonth+'-'+fday+'至'+tyear+'-'+tmonth+'-'+tday}`;				obj={					fyear,fmonth,fday,tyear,tmonth,tday				}				this.checkObj=obj;				this.$nextTick(()=>{					this.pickVal=arr;				})				this.$emit("change",{					result:result,					value:result.split("至"),					obj:obj				})							}		}	}</script><style lang="scss">	@import "./w-picker.css";</style>
 |