(本人第一次写博客,第一次接触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>
如有任何问题,欢迎提出友好的建议.
如有任何问题,欢迎提出友好的建议.