关于Date对象那些事

在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 (中国标准时间)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容