美文网首页
关于Date对象那些事

关于Date对象那些事

作者: celineWong7 | 来源:发表于2019-01-18 15:05 被阅读0次

    在JavaScript内置对象中,有一个很Date对象,它专门用来获取设置日期。
    当然自带的方法也很多,这里不一一讲解列举,想回顾的可以移步菜鸟教程:JavaScript Date 对象
    此处感兴趣的是几个实用的案例,比如网上盛行 转换指定日期格式获取当前日期的前几天/后几天,等等。欢迎补充。

    1. 将 标准时间 转化为指定格式

    获取当前日期时间,我们知道通过方法 new Date() 就可以得到,但是获取到是一个标准格式时间 Fri Jan 18 2019 13:56:47 GMT+0800 (中国标准时间)。但通常我们更渴望得到 2019-01-18 13:56:47 或者 2019/01/18 13:56:47 这种格式。

    下面直接给出方案,若想深入了解,可以移步将 Date对象 转化为指定格式详解 —— 关于Date对象那些事(番外)

    通用函数式

    直接封装一个函数,然后调用函数,带入想要的日期格式即可。

        /**
         * formatDate
         * @param  {string} a 指定格式的字符串,例如 "yyyy-M-d h:m:s"
         * @return {string}
         */
        function formatDate(a){
            var d = new Date();
            var o = {
                "M+": d.getMonth() + 1,
                "d+": d.getDate(),
                "h+": d.getHours(),
                "m+": d.getMinutes(),
                "s+": d.getSeconds(),
                "q+": Math.floor((d.getMonth() + 3) / 3),
                "S": d.getMilliseconds()
            };
            if (/(y+)/.test(a)) a = a.replace(RegExp.$1, (d.getFullYear() + "").substr(4 - RegExp.$1.length));
            for (var k in o) {
                if (new RegExp("(" + k + ")").test(a)) a = a.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
            }
            return a;
        }
    
     // 调用方式
    formatDate("yyyy-M-d"); //  2019-1-18
    

    追加成Date对象的方法式

    这种方式更直接,可以用 new Date() 后得到的日期对象,直接调用该方法。

        /**
         * Format 对Date的扩展,将 Date 转化为指定格式的String
         * @param {String} a 指定格式的字符串,例如 "yyyy-M-d h:m:s"
         * @return {String} 匹配指定格式的日期时间字符串
         *
         * 说明:月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字) 
         * 例子:   
         * (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423   
         * (new Date()).Format("yyyy-M-d h:m:s.S")      ==> 2006-7-2 8:9:4.18  
         */
        Date.prototype.Format = function(a) {
        var o = {
            "M+": this.getMonth() + 1,
            "d+": this.getDate(),
            "h+": this.getHours(),
            "m+": this.getMinutes(),
            "s+": this.getSeconds(),
            "q+": Math.floor((this.getMonth() + 3) / 3),
            "S": this.getMilliseconds()
        };
        if (/(y+)/.test(a)) a = a.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
        for (var k in o) {
            if (new RegExp("(" + k + ")").test(a)) a = a.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)))
        }
        return a
    };
    
    // 调用方式
    new Date().Format("yy-MM-dd hh:mm:ss"); //19-01-18 15:04:30
    

    2. 获取当前日期的n天后

    有时候,我们可能想要得到明天是几号?后天是几号?n天后就几号? 比如想要获取明天是日期:
    粗略想法:我们可以通过getDate获取当前日期,然后通过+1操作。但遇到月末那一天,第二天就应该是1号,这就需要通过月份分别取判断,也可以做,但有点繁琐,这里就不给出了。
    故作聪明的想法Date对象本身就很强大啊,我们能不能以日期格式累加一天,容它自己判断计算,我们最后再去getDate啊。当然可以,看下面代码:

        var d1 = new Date();// 当前日期
        var d2 = new Date(d1.setDate(d1.getDate()+1)).getDate(); // 第二天日期(几号)
    

    注意:setDate()的返回值是: 调整过的日期的毫秒表示。所以我们需要再一次new Date(),让它成为标准日期对象。

    我们可以考虑把它封装成一个函数,带入参数n,来得到任意指定天数的前/后日期:

    /**
     * 获取当前时间前/后的某一天日期
     * @param  {number} n n天前(负数)/后(正数)
     * @return {number}   n天前/后的日期
     */
    function  getSomeoneDate(n) {
        var d1 = new Date();// 当前日期
        var d2 = new Date(d1.setDate(d1.getDate()+n)).getDate(); // n天前/后
        return d2;
    }
    
    console.log(getSomeoneDate(-2));
    console.log(getSomeoneDate(-1));
    console.log(getSomeoneDate(0));
    console.log(getSomeoneDate(1));
    console.log(getSomeoneDate(2));
    

    3. 设置日期为上个月15号

    如果是想设置当前月的日期,比较简单,直接调用setDate()方法,参数写入要设置的日期就可以了。但若是想设置上个月的指定日期,我们就需要先让Date对象月份变成上个月。
    此处可以用一个讨巧的方法:

    1. 先用 setDate(0) - 设置上个月最后一天,让月份变成上个月。
    2. 紧接着再 setDate(15) - 设置15号。
        var d = new Date();// 1. 当前日期
        console.log(d); // Fri Jan 18 2019 15:30:34 GMT+0800 (中国标准时间)
        console.log(d.getDate()); // 18
    
        d.setDate(15);// 2. 设置当前月份的15号
        console.log(d); // Tue Jan 15 2019 15:27:54 GMT+0800 (中国标准时间)
    
        d.setDate(0);// 3. 设置上个月最后一天
        console.log(d); // Mon Dec 31 2018 15:30:58 GMT+0800 (中国标准时间)
    
        d.setDate(15);// 4. 设置上个月15号。
        // 注意,此处是因为在第3步骤中,变量d的月份已经变成了上个月,所以此处再设置15号,就变成了上个月15号
        console.log(d); // Sat Dec 15 2018 15:38:31 GMT+0800 (中国标准时间)
    

    注意:在setDate()方法中,写入参数大于月份最大天数,会自动顺移到下个月的日期。比如当前月份是1月,调用setDate(33),就会得到 2月2号 。

    上面的方法我们同样也可以封装如下:

    /**
     * 设置上个月的日期
     * @param {number} n 日期号
     * (n 的范围最好在所属月份的最大天数内,范围外不报错,会根据月份顺移日期)
     */
    function setLastMonthDate(n){
        var d = new Date();
        d.setDate(0);
        d.setDate(n);
    }
    
    console.log(setLastMonthDate(11)); // Tue Dec 11 2018 14:54:14 GMT+0800 (中国标准时间)
    

    相关文章

      网友评论

          本文标题:关于Date对象那些事

          本文链接:https://www.haomeiwen.com/subject/helndqtx.html