Flex3选择某一周的小控件.

(本人第一次写博客,第一次接触Flex可能不是很专业,如若程序有问题, 还望大家指出不足,以鞭策我进步.)

在业务中的时间是按照一周一周来算的话,那么可能需要使用到这种小控件.使用起来还是比较方便的.


话不多说,直接内容.

首先,这个控件是默认加载当前对应的下一周的情况(可以根据需求自己改.)

然后默认将每周的星期一作为一周的第一天(如果想要将周末视为一周的第一天,那么也可以改,只是改动较大.)

关于周的计算,稍微麻烦一些的是两个月的月头和月尾.这时,我采用的是过半法,也就是说,哪个月的日期占了四天以上就视这周是哪个月的.

图片中有显示这种情况

.



最后是代码.

<?xml version="1.0" encoding="utf-8"?>
<mx:HBox  xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" creationComplete="init()" height="100%" horizontalAlign="left" xmlns:controls="components.controls.*">
	<controls:CustomDateFormatter  id="dDate" formatString="YYYY-MM-01"/><!--得到每个月的第一天-->
	<controls:CustomDateFormatter id="fDate" formatString="YYYY年MM月"/><!--格式化月份需要-->
	<controls:CustomDateFormatter id="eDate" formatString="YYYY-MM-DD"/><!--格式化天的时候需要.-->
	<mx:Script>
		<![CDATA[
			import mx.collections.ArrayCollection;
			import mx.controls.Alert;
			[Bindable]
			private var currentDate:Date=new Date;//当前日期.
			[Bindable]
			private var yearMonth:String;//年月的str
			[Bindable]
			private var week:String;//周的str;
			[Bindable]
			public var loadFunction:Function;//传过来的,要调用的方法.
			[Bindable]
			public var weekDatesStr:ArrayCollection=new ArrayCollection;//当前周对应的日期的Str
			/**
			 * 初始化
			 * */
			private function init():void{
				eNextWeek();
			}
			/***
			 * 调用传递的参数的方法.
			 * */
			private function loadData():void
			{
				if(this.loadFunction != null) {
					loadFunction();
				}
			}
			/***
			 * 前一周
			 * */
			private function ePrevWeek():void
			{
				currentDate=new Date(currentDate.fullYear,currentDate.month,currentDate.date-7);
				yearMonth=currentMonth(currentDate);
				week=currentWeek(currentDate);
				DayOfWeekDate(currentDate);
				loadData();
			}
			/**
			 * 点击下一周执行的方法.
			 * */
			private function eNextWeek():void
			{
				currentDate=new Date(currentDate.fullYear,currentDate.month,currentDate.date+7);
				yearMonth=currentMonth(currentDate);
				week=currentWeek(currentDate);
				DayOfWeekDate(currentDate);
				loadData();
			}
			
			/**
			 *月份.
			 * 格式化月份.普通情况就直接格式化月份.
			 * 主要是防止第一周,这个第一个周是上个月的还是下个月的.如果是上个月的,然后月份就上个月的.
			 * 
			 * */
			private function currentMonth(date:Date):String
			{
				var dateOneStr:String=dDate.format(date); //根据七天后的日期,得到这个月的第一天.
				var dateOneDate:Date=dDate.convertToDate(dateOneStr);//得到这个月的1号.
				var temp:Date=new Date(date.getFullYear(),date.getMonth(),date.getDate());//默认的月份是当前月,如果选中的是这个月的头一周,但是这一周又不是这个月的就是上个月的了.
				var dateMax:Date=new Date(date.getFullYear(),date.getMonth(),getMaxDay(date));//得到这个月的最后一天.如果是这个月的最后一周,同时这周又不属于这个月,那么就是下个月的了.
				// 得到当天之后的第七天,然后-1 然后+这个月的第一个天.
				if((date.day>=5||date.day==0) && date.date-dateOneDate.date<=2 &&(dateOneDate.day>=5||dateOneDate.day==0)){
					//如果当前月份的1号是 星期五 到 日,同时当前日期也是和一号同一个星期.那么,这时,这个月份应该是算是算上个月的最后一个星期,月份也要显示为上个月.
					temp=new Date(date.getFullYear(),date.getMonth()-1,date.getDate());
				}else if(dateMax.date-date.date<=2 && date.day<=3 && date.day!=0 && dateMax.day<=3 && dateMax.day!=0 ){
					//如果选择的是这个月的最后一周,同样需要判断这周应该是属于哪个月.
					//如果这个月的最后一周是周一 到周三之间,同时当前调整后的日期和最后一天是同一周,那么这周应该是属于下个月的.
					temp=new Date(date.getFullYear(),date.getMonth()+1,date.getDate());
				}	
				return fDate.format(temp);
			}
			/***
			 * 得对应的周数.
			 * 既需要考虑到第一周,也需要考虑到最后一周.
			 * 主要预防这个月的最后一周不是算在这个月里,而是算在下个月里的情况.
			 * 判断依据,如果最后一天的周数,小于等于3,大于0表示最后一周不是这个月的,是下个月的.
			 * 
			 * */
			private function currentWeek(date:Date):String
			{
				var index:int=0;
				var weeks:Array=['第一周','第二周','第三周','第四周','第五周','第六周','第七周'];
				var dateOneStr:String=dDate.format(date); //根据七天后的日期,得到这个月的第一天.
				var dateOneDate:Date=dDate.convertToDate(dateOneStr);//得到这个月的1号.
				var dateMax:Date=new Date(date.getFullYear(),date.getMonth(),getMaxDay(date));//得到这个月的最后一天.如果是这个月的最后一周,同时这周又不属于这个月,那么就是下个月的了.
				// 得到当天之后的第七天,然后-1 然后+这个月的第一个天.
				var yssj:Number=Math.ceil(((date.date-1)+dateOneDate.day)/7);
				if((date.day>=5||date.day==0) && date.date-dateOneDate.date<=2 &&(dateOneDate.day>=5||dateOneDate.day==0)){//月头.
					//如果当前月份的1号是 星期五 到 日,同时当前日期也是和一号同一个星期.那么,这时,这个月份应该是算是算上个月的最后一个星期,月份也要显示为上个月.
					//星期就是上个月的最后一个月,至于算第几周,那么就需要判断了.
					 var preMonth:Date=new Date(date.getFullYear(),date.getMonth()-1,1);//得到上个月的对象.
					 var preMonthMin:Date=dDate.convertToDate(dDate.format(preMonth));//得到上个月的一号.
					 var preTotalDay:Number=getMaxDay(preMonthMin);
					 var perMonthMax:Date=new Date(preMonthMin.getFullYear(),preMonthMin.getMonth(),preTotalDay);//得到这个月的最后一天.
					 var weekNum:int=0;//表示周数.
					 if(preMonthMin.day>=1&&preMonthMin.day<=4){//看第一周算不上它的,星期一到星期五之间都算它的.
					 	weekNum++;
					 }
					 if(preMonthMin.day!=0){//不是周末,用8减
						 preTotalDay=preTotalDay-(8-preMonthMin.day);//减去第一周浪费的天数.
					 }else{
					 	preTotalDay--;// 是周末,只浪费了一天.
					 }
					 var moreDay:Number=preTotalDay%7;//将剩下的天数对7取模
					 preTotalDay=preTotalDay-moreDay;//然后减去.除不尽的
					 weekNum=weekNum+preTotalDay/7;
					 //最后判断一下最后一周算不算它的
					 weekNum++;//最后一周也算它的.正是因为这个条件才进来的
					 index=weekNum-1;
				}else if(dateMax.date-date.date<=2 && date.day<=3 && date.day!=0 && dateMax.day<=3 && dateMax.day!=0 ){//月尾
					//如果选择的是这个月的最后一周,同样需要判断这周应该是属于哪个月.
					//如果这个月的最后一周是周一 到周三之间,同时当前调整后的日期和最后一天是同一周,那么这周应该是属于下个月的.第一周.
					  index=0;
				}else {//本月之内的.只需要判断第一个星期是不是自己的.然后操作.
					var weekNum_:int=0;//表示周数.
					if(dateOneDate.day>=1&&dateOneDate.day<=4){//看第一周算不上它的,星期一到星期五之间都算它的.
					 	weekNum_++;
					}
					var total:Number=date.getDate();//得到当前日期的天数.
					if(dateOneDate.day!=0){//不等于0 表示是周一到周五,直接用8减.
						total=total-(8-dateOneDate.day);//减去第一周浪费的天数.
					}else{//等于0 表示是周末,所以只浪费了一天.
						total--;
					}
					var moreDay_:Number=total%7;//将剩下的天数对7取模
					if(moreDay_>=1){//只要还有余数,标识正在下一周的进行时,所以加1
						weekNum_++;
					}
					total=total-moreDay_;//然后减去.除不尽的
					weekNum_=weekNum_+total/7;
					//最后判断一下最后一周算不算它的
					index=weekNum_-1;
				}
				 return weeks[index];
			}
			/**
			 * 得到对应的一周的日期
			 * */
			private function DayOfWeekDate(date:Date):void
			{
				weekDatesStr.removeAll();//移除所有.
				var dateDay:Number=date.getDay();
				if(dateDay==0){//如果dateDay为周末,就需要
					dateDay=7;//将dateDay设置为0,方便计算.
				}
//				Alert.show(eDate.format(date));
				for(var index:int=1;index<=7;index++){//从周一到周六
					var preDate:Date=new Date(date.getFullYear(),date.getMonth(),date.getDate()+(index-dateDay));
					var str:String=eDate.format(preDate);
//					Alert.show(str);
					weekDatesStr.addItem(str);
				}
			}
			
			/**
			 * 根据日期得到这个月的天数.
			 * */
			private function getMaxDay(date:Date):Number{
				 var nowMonth:Date=new Date(date.getFullYear(),date.getMonth(),1);
				 var nextMonth:Date=new Date(date.getFullYear(),date.getMonth()+1,1); 
				 var nowStr:String=eDate.format(nowMonth);
				 var nextStr:String=eDate.format(nextMonth);
				 var dates:Number=((nextMonth.getTime()-nowMonth.getTime())/(60*60*24*1000));//在Flex中的getTime得到的是毫秒数.所以需要乘以1000
				 return dates;
			}
		]]>
	</mx:Script>
	
	
	<mx:Grid  width="400" height="85">
		<mx:GridRow>
			<mx:GridItem width="100%">
				<mx:HBox width="400" height="85">
					<mx:Text id="cPrevious" text="◀" useHandCursor="true" click="ePrevWeek()"/>
					<mx:Text id="cMonth" text="{yearMonth}"/><mx:Spacer/>
					<mx:Text id="cWeek" text="{week}"/>
					<mx:Text id="cNext" text="▶" useHandCursor="true" click="eNextWeek()"/>
				</mx:HBox>
			</mx:GridItem>
		</mx:GridRow>
	</mx:Grid>
</mx:HBox>


如有任何问题,欢迎提出友好的建议.


如有任何问题,欢迎提出友好的建议.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值