关于Date对象那些事

2019-01-18  本文已影响0人  celineWong7

在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 (中国标准时间)
上一篇下一篇

猜你喜欢

热点阅读