2

github中有很多非常好用的日期操作库,如moment.js;但是平常的项目用的的方法有限,未免有些冗余,特提取出比较常用的一些方法

有些人可能会觉得Date.prototype.的方式在方法的扩展中更实用些,确实如此。本中都是单独拉出来的方法,使用者可自行组装。

日期格式化

 /** 日期格式化
 * @param {Number String Date} 
 * @param {String} 'YYYY-MM-DD HH:mm:ss EEE' 年(Y)、月(M)、日(D)、12小时(h)、24小时(H)、分(m)、秒(s)、毫秒(S)、周(E)、季度(q)
 * @return {String}
 * @example XDate.format(new Date(), "YYYY-MM-DD") ==> 2017-08-23
 */
XDate.format = function(date, fmt) {
    fmt = fmt || 'YYYY-MM-DD HH:mm:ss';
    if (typeof date === 'string') {
        date = new Date(date.replace(/-/g, '/'))
    }
    if (typeof date === 'number') {
        date = new Date(date)
    }
    var o = {
        'M+': date.getMonth() + 1,
        'D+': date.getDate(),
        'h+': date.getHours() % 12 === 0 ? 12 : date.getHours() % 12,
        'H+': date.getHours(),
        'm+': date.getMinutes(),
        's+': date.getSeconds(),
        'q+': Math.floor((date.getMonth() + 3) / 3),
        'S': date.getMilliseconds()
    }
    var week = {
        '0': '\u65e5',
        '1': '\u4e00',
        '2': '\u4e8c',
        '3': '\u4e09',
        '4': '\u56db',
        '5': '\u4e94',
        '6': '\u516d'
    }
    if (/(Y+)/.test(fmt)) {
        fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
    }
    if (/(E+)/.test(fmt)) {
        fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? '\u661f\u671f' : '\u5468') : '') + week[date.getDay() + ''])
    }
    for (var k in o) {
        if (new RegExp('(' + k + ')').test(fmt)) {
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
        }
    }
    return fmt;
}

闰年判断

闰年:能被4整除但不能被100整出

/** 判断是否为闰年
 * @param {Number} yr
 * @return {Boolean}
 */

XDate.isLeapyear = function(yr) {
    return (yr % 4 === 0 && yr % 100 !== 0) || yr % 400 === 0
}

获取某一年份的指定月份的天数

闰年的二月是个特殊值(依赖与isLeapyear函数)

/** 获取某一年份的某一月份的天数
 * @param {Number} year
 * @param {Number} month
 */
XDate.getMonthDays = function(year, month) {
    return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month-1] || (XDate.isLeapyear.call(null, year) ? 29 : 28);
}

获取某个时间前/后的时间

/** 获取某个时间相加/减后的时间
* @param {Date} date
* @param {Number} num 参数为正时时间前移,为负时间后移
* @param {String} type y / m / d / h / m / s / ms
 */
XDate.modify = function (date, num, type) {
    date = this.converDate(date);  
    if (!num) {
        return date;
    }
    switch (type) {
        case "y":
            date.setFullYear(+date.getFullYear() + num);
            break;
        case "m":
            date.setMonth(+date.getMonth() + num);
            break;
        case "d":
            date.setDate(+date.getDate() + num);
            break;
        case "h":
            date.setHours(+date.getHours() + num);
            break;
        case "m":
            date.setMinutes(+date.getMinutes() + num);
            break;
        case "s":
            date.setSeconds(+date.getSeconds() + num);
            break;
        case "ms":
            date.setMilliseconds(+date.getMilliseconds() + num);
            break;
    }
    return date;
}

同梦奇缘
4.1k 声望1.1k 粉丝

生于忧患死于安乐