Flex3选择某一周的小控件.
发布时间:2020-12-15 03:39:15 所属栏目:百科 来源:网络整理
导读:(本人第一次写博客,第一次接触Flex可能不是很专业,如若程序有问题,还望大家指出不足,以鞭策我进步.) 在业务中的时间是按照一周一周来算的话,那么可能需要使用到这种小控件.使用起来还是比较方便的. 话不多说,直接内容. 首先,这个控件是默认加载当前对应的下
(本人第一次写博客,第一次接触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.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(),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(),然后-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(),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.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(),1); var nextMonth:Date=new Date(date.getFullYear(),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> 如有任何问题,欢迎提出友好的建议.
如有任何问题,欢迎提出友好的建议.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |