zoukankan      html  css  js  c++  java
  • 日期的自动计算

    问题描述:今天碰到这样一个问题“有两个日期下拉选择框,当选择其中一个日期时,自动给另一个日期赋值。例如,第一个日期选择为周一,另一个自动赋值为周日”。

    分析:对于这样一个小功能,听起来并没有什么难点,所以就没有多想,但是等到真正实现的时候,突然发现涉及到日期加减值的时候,无形中就跟闰年、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;
        }
  • 相关阅读:
    Angular2.0的学习(四)
    JAVA 中BIO,NIO,AIO的理解
    分布式调用技术 RPC VS REST
    深入浅出单实例Singleton设计模式
    接口设计六大原则
    线程安全的简单理解
    class<T>和 class<?>类型 有什么区别
    随笔记录
    问题记录总结
    JDK1.8 新特性(全)
  • 原文地址:https://www.cnblogs.com/xfq-sean/p/5276870.html
Copyright © 2011-2022 走看看