Flex3选择某一周的小控件.

来源:互联网 发布:阴阳师6星土豪酒吞数据 编辑:程序博客网 时间:2024/05/16 10:09

(本人第一次写博客,第一次接触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){//只要还有余数,标识正在下一周的进行时,所以加1weekNum_++;}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
原创粉丝点击