日期的自动计算
问题描述:今天碰到这样一个问题“有两个日期下拉选择框,当选择其中一个日期时,自动给另一个日期赋值。例如,第一个日期选择为周一,另一个自动赋值为周日”。
分析:对于这样一个小功能,听起来并没有什么难点,所以就没有多想,但是等到真正实现的时候,突然发现涉及到日期加减值的时候,无形中就跟闰年、2月、31天月份、30天月份联系在一起了。虽然网上对于这样的问题随便一搜,就会有类似的现成代码,但是在这个过程之前,自己还是想动手写一下,权当消遣一下了。
设计:类似于这样一个独立的小功能,当然还是单独放到一个小方法里比较妥当了,输入为选择的日期(周一),输出为计算得到的日期(周日)。由周一的日期得到周日的日期,直接加上6就好了嘛,当然我们还是要具体考虑一下各种特殊的情况:
1.判断年份是否是闰年,直接影响的就是2月份是28天,还是29天。我们小学就学过,能被4整除但不能被100整除的年份或者能被400整除的年份为闰年。
2.判断月份是否是2月。
3.判断月份是30天还是31天,1、3、5、7、8、10、12月31天,4、6、9、11月30天。
4.判断日期增长后是否跨越月份,若跨越月份,月份要加1。
5.判断月份增长后是否跨越年份,若跨越年份,年份需要加1.
实现:综合以上分析,代码实现如下:
//给出周一的日期,返回本周周日的日期 function GetSundayDate(mondayDate) { var isLeapYear, Myear, Mmonth, Mday, Syear, Smonth, Sday; isLeapYear = false; Myear=mondayDate.getFullYear(); Mmonth=mondayDate.getMonth() + 1; Mday = mondayDate.getDate(); Syear = Myear; Smonth = Mmonth; //1.首先判断是否是闰年 if ((Myear%4==0 && Myear%100!=0)||Myear%100==0) { isLeapYear = true; } else { isLeapYear = false; } //2.判断是否2月 if (Mmonth==2) { if (Mday < 23 || (Mday == 23 && isLeapYear)) { //周一日期小于2月23或者为闰年2月23号 Sday = Mday + 6; } else if (isLeapYear) { //闰年 Smonth = Mmonth+1; Sday = Mday + 6 - 29; } else {//非闰年 Smonth = Mmonth+1; Sday = Mday + 6 - 28; } } else if (Mday <25) { //周日在本月 Sday = Mday + 6; } else if(Mmonth==4||Mmonth==6||Mmonth==9||Mmonth==11){ //每月30天的月份,周日在下个月 Smonth = Mmonth + 1; Sday = Mday + 6 - 30; } else if (Mday==25) { //每月31天的月份,周日仍在本月 Sday = Mday + 6; } else {//每月31天的月份,周日在下个月 Smonth = Mmonth + 1; Sday = Mday + 6 - 31; } //5.月份加后判断是否是12月,如果是,年份加1 if (Smonth > 12) { Syear++; Smonth = 1; } return Syear + "-" + Smonth + "-" + Sday; }