1. 程式人生 > >通過js date對象獲取各種開始結束日期的示例

通過js date對象獲取各種開始結束日期的示例

module nds true 因此 通過 開始 then key undefine

有時候做一些任務計劃的功能時候,需要提供一個開始時間或者結束時間,比如本周結束,本月結束,今天結束等等,因此,我參考網上的資料把相關的實現為一個項目:

  • gitee: https://gitee.com/dhclly/icedog.date-edge
  • github: https://github.com/DHclly/icedog.date-edge/tree/master

執行測試用例,可以得到下面這種形式的結果:

當前的時間: 2018-12-10 14:38:09
昨天的開始日期: 2018-12-9 00:00:00
昨天的結束日期: 2018-12-10 00:00:00
今天的開始日期: 2018-12-10 00:00:00
今天的結束日期: 2018-12-11 00:00:00
明天的開始日期: 2018-12-11 00:00:00
明天的結束日期: 2018-12-12 00:00:00
上周的開始日期(星期一為一周開始): 2018-12-3 00:00:00
上周的結束日期(星期一為一周開始): 2018-12-10 00:00:00
本周的開始日期(星期一為一周開始): 2018-12-10 00:00:00
本周的結束日期(星期一為一周開始): 2018-12-17 00:00:00
下周的開始日期(星期一為一周開始): 2018-12-17 00:00:00
下周的開始日期(星期一為一周開始): 2018-12-24 00:00:00
上周的開始日期(星期日為一周開始): 2018-12-2 00:00:00
上周的結束日期(星期日為一周開始): 2018-12-9 00:00:00
本周的開始日期(星期日為一周開始): 2018-12-9 00:00:00
本周的結束日期(星期日為一周開始): 2018-12-16 00:00:00
下周的開始日期(星期日為一周開始): 2018-12-16 00:00:00
下周的開始日期(星期日為一周開始): 2018-12-23 00:00:00
上月的開始日期: 2018-11-1 00:00:00
上月的結束日期: 2018-12-1 00:00:00
本月的開始日期: 2018-12-1 00:00:00
本月的結束日期: 2019-01-1 00:00:00
下月的開始日期: 2019-01-1 00:00:00
下月的結束日期: 2019-02-1 00:00:00
去年的開始日期: 2017-01-1 00:00:00
去年的結束日期: 2018-01-1 00:00:00
今年的開始日期: 2018-01-1 00:00:00
今年的結束日期: 2019-01-1 00:00:00
明年的開始日期: 2019-01-1 00:00:00
明年的結束日期: 2020-01-1 00:00:00

源碼:

/**
 * 獲取默認的日期格式化配置
 */
function getDefaultDateFormatConfig() {
    var defaultFormatConfig = {
        /** 年月日的分隔符 */
        separator: "-",
        /** 是否顯示毫秒 */
        showMillisecond: false,
        /** 是否填充0 */
        isFillZero: true,
    }
    return defaultFormatConfig;
}

/**
 * 填充 0 
 * @param {number} num 
 */
function fillZero(num) {
    return (num > 10 ? "" : "0") + num;
}
/**
 * 簡單的繼承實現
 * @param {object} obj 繼承的對象
 * @param {object} extendObj 被繼承的對象
 */
function extend(obj, extendObj) {
    for (key in extendObj) {
        if (extendObj.hasOwnProperty(key)) {
            obj[key] = extendObj[key];
        }
    }
    return obj;
}

/**
 * 格式化日期對象為字符串,如:1992-1-5 00:00:00
 * @param {Date} date 日期對象
 * @param {object} config 配置對象,支持參數參考defaultFormatConfig
 */
function formatDate(date, config) {
    var defaultConfig = this.defaultConfig;
    var config = extend(defaultConfig, config);

    var separator = config.separator;
    var showMillisecond = config.showMillisecond;
    var isFillZero = config.isFillZero;

    var year = date.getFullYear();
    var month = (date.getMonth() + 1);
    var day = date.getDate();
    var hour = date.getHours();
    var minute = date.getMinutes();
    var second = date.getSeconds();
    var millisecond = date.getMilliseconds();

    if (isFillZero) {
        month = fillZero(month);
        date = fillZero(day);
        hour = fillZero(hour);
        minute = fillZero(minute);
        second = fillZero(second);
    }

    var formatStr = year + separator + month + separator + day + " " + hour + ":" + minute + ":" + second;

    if (showMillisecond) {
        formatStr += "." + millisecond;
    }
    return formatStr;
}

/**
 * 獲取一個時分秒毫秒的值都是00的日期對象
 * @param {number} fullYear 年份 如 2018
 * @param {number} month 月 以0開始
 * @param {number} day 日
 */
function getDateWithFillHMSSZero(fullYear, month, day) {
    var date = new Date();
    if (fullYear) {
        date.setFullYear(fullYear);
    }
    if (month) {
        date.setMonth(month);
    }
    if (day) {
        date.setDate(day);
    }
    date.setHours(0);
    date.setMinutes(0);
    date.setSeconds(0);
    date.setMilliseconds(0);
    return date;
}

module.exports = {
    formatDate: formatDate,
    defaultConfig: getDefaultDateFormatConfig(),
    /**
     * 獲取當前的日期
     */
    getNowDate: function () {
        var date = new Date();
        return date;
    },
    /**
    * 獲取昨天的開始日期
    */
    getYesterdayBegin: function () {
        var date = getDateWithFillHMSSZero();
        date.setDate(date.getDate() - 1);
        return date;
    },
    /**
     * 獲取昨天的結束日期
     */
    getYesterdayEnd: function () {
        return this.getTodayBegin();
    },
    /**
     * 獲取今天的開始日期
     */
    getTodayBegin: function () {
        var date = getDateWithFillHMSSZero();
        return date;
    },
    /**
     * 獲取今天的結束日期
     */
    getTodayEnd: function () {
        var date = getDateWithFillHMSSZero();
        date.setDate(date.getDate() + 1);
        return date;
    },
    /**
    * 獲取明天的開始日期
    */
    getTomorrowBegin: function () {
        return this.getTodayEnd();
    },
    /**
     * 獲取明天的結束日期
     */
    getTomorrowEnd: function () {
        var date = getDateWithFillHMSSZero();
        date.setDate(date.getDate() + 2);
        return date;
    },
    /**
     * 獲取上周的開始日期
     * @param {boolean} isStartByMonday 是否以本周星期一的 00:00:00 刻為開始日期,默認true,如果是false,則以本周星期日的 00:00:00 刻為開始日期
     */
    getLastWeekBegin: function (isStartByMonday) {
        if (isStartByMonday === undefined || isStartByMonday === null) {
            isStartByMonday = true;
        }
        var date = getDateWithFillHMSSZero();
        //現在通常的做法(也是國際慣例),是把星期日作為一周的開始,而星期六則是周末
        //這裏的day表示天,星期用 dayOfWeek 表示
        var day = date.getDate();
        var dayOfWeek = date.getDay();//星期日的值是0

        var dayValue = 0;
        if (isStartByMonday) {
            //如果以星期一為開始,那麽星期天應該是7
            if (dayOfWeek === 0) {
                dayOfWeek = 7;
            }
            dayValue = day - dayOfWeek + 1 - 7;
        } else {
            dayValue = day - dayOfWeek - 7;
        }
        date.setDate(dayValue);
        return date;
    },
    /**
     * 獲取上周的結束日期
     * @param {boolean} isStartByMonday 是否以下周星期一的 00:00:00 刻為開始日期,默認true,如果是false,則以下周星期日的 00:00:00 刻為開始日期
     */
    getLastWeekEnd: function (isStartByMonday) {
        return this.getThisWeekBegin(isStartByMonday);
    },
    /**
     * 獲取本周的開始日期
     * @param {boolean} isStartByMonday 是否以本周星期一的 00:00:00 刻為開始日期,默認true,如果是false,則以本周星期日的 00:00:00 刻為開始日期
     */
    getThisWeekBegin: function (isStartByMonday) {
        if (isStartByMonday === undefined || isStartByMonday === null) {
            isStartByMonday = true;
        }
        var date = getDateWithFillHMSSZero();
        //現在通常的做法(也是國際慣例),是把星期日作為一周的開始,而星期六則是周末
        //這裏的day表示天,星期用 dayOfWeek 表示
        var day = date.getDate();
        var dayOfWeek = date.getDay();//星期日的值是0

        var dayValue = 0;
        if (isStartByMonday) {
            //如果以星期一為開始,那麽星期天應該是7
            if (dayOfWeek === 0) {
                dayOfWeek = 7;
            }
            dayValue = day - dayOfWeek + 1;
        } else {
            dayValue = day - dayOfWeek;
        }
        date.setDate(dayValue);
        return date;
    },
    /**
     * 獲取本周的結束日期
     * @param {boolean} isStartByMonday 是否以下周星期一的 00:00:00 刻為開始日期,默認true,如果是false,則以下周星期日的 00:00:00 刻為開始日期
     */
    getThisWeekEnd: function (isStartByMonday) {
        if (isStartByMonday === undefined || isStartByMonday === null) {
            isStartByMonday = true;
        }
        var date = getDateWithFillHMSSZero();
        //現在通常的做法(也是國際慣例),是把星期日作為一周的開始,而星期六則是周末
        //這裏的day表示天,星期用 dayOfWeek 表示
        var day = date.getDate();
        var dayOfWeek = date.getDay();//星期日的值是0
        var dayValue = 0;
        if (isStartByMonday) {
            //如果以星期一為開始,那麽星期天應該是7
            if (dayOfWeek === 0) {
                dayOfWeek = 7;
            }
            dayValue = day + (7 - dayOfWeek) + 1;
        } else {
            dayValue = day + (7 - dayOfWeek);
        }
        date.setDate(dayValue);
        return date;
    },
    /**
     * 獲取下周的開始日期
     * @param {boolean} isStartByMonday 是否以本周星期一的 00:00:00 刻為開始日期,默認true,如果是false,則以本周星期日的 00:00:00 刻為開始日期
     */
    getNextWeekBegin: function (isStartByMonday) {
        return this.getThisWeekEnd(isStartByMonday);
    },
    /**
     * 獲取下周的結束日期
     * @param {boolean} isStartByMonday 是否以下周星期一的 00:00:00 刻為開始日期,默認true,如果是false,則以下周星期日的 00:00:00 刻為開始日期
     */
    getNextWeekEnd: function (isStartByMonday) {
        if (isStartByMonday === undefined || isStartByMonday === null) {
            isStartByMonday = true;
        }
        var date = getDateWithFillHMSSZero();
        //現在通常的做法(也是國際慣例),是把星期日作為一周的開始,而星期六則是周末
        //這裏的day表示天,星期用 dayOfWeek 表示
        var day = date.getDate();
        var dayOfWeek = date.getDay();//星期日的值是0
        var dayValue = 0;
        if (isStartByMonday) {
            //如果以星期一為開始,那麽星期天應該是7
            if (dayOfWeek === 0) {
                dayOfWeek = 7;
            }
            dayValue = day + (7 - dayOfWeek) + 1 + 7;
        } else {
            dayValue = day + (7 - dayOfWeek) + 7;
        }
        date.setDate(dayValue);
        return date;
    },
    /**
     * 獲取上月的開始日期
     */
    getLastMonthBegin: function () {
        var date = getDateWithFillHMSSZero();
        date.setMonth(date.getMonth() - 1);
        date.setDate(1)//設置天為1
        return date;
    },
    /**
     * 獲取上月的結束日期
     */
    getLastMonthEnd: function () {
        return this.getThisMonthBegin();
    },
    /**
 * 獲取本月的開始日期
 */
    getThisMonthBegin: function () {
        var date = getDateWithFillHMSSZero();
        date.setDate(1)//設置天為1
        return date;
    },
    /**
     * 獲取本月的結束日期
     */
    getThisMonthEnd: function () {
        var date = getDateWithFillHMSSZero();
        date.setMonth(date.getMonth() + 1);
        date.setDate(1)//設置天為1
        return date;
    },
    /**
     * 獲取下月的開始日期
     */
    getNextMonthBegin: function () {
        return this.getThisMonthEnd();
    },
    /**
     * 獲取下月的結束日期
     */
    getNextMonthEnd: function () {
        var date = getDateWithFillHMSSZero();
        date.setMonth(date.getMonth() + 2);
        date.setDate(1)//設置天為1
        return date;
    },
    /**
     * 獲取去年的開始日期
     */
    getLastYearBegin: function () {
        var date = getDateWithFillHMSSZero();
        date.setFullYear(date.getFullYear() - 1);
        date.setMonth(0);//月是從0開始算
        date.setDate(1);
        return date;
    },
    /**
     * 獲取去年的結束日期
     */
    getLastYearEnd: function () {
        return this.getThisYearBegin();
    },
    /**
     * 獲取今年的開始日期
     */
    getThisYearBegin: function () {
        var date = getDateWithFillHMSSZero();
        date.setMonth(0);//月是從0開始算
        date.setDate(1);
        return date;
    },
    /**
     * 獲取今年的結束日期
     */
    getThisYearEnd: function () {
        var date = getDateWithFillHMSSZero();
        date.setFullYear(date.getFullYear() + 1);
        date.setMonth(0);//月是從0開始算
        date.setDate(1);
        return date;
    },
    /**
     * 獲取明年的開始日期
     */
    getNextYearBegin: function () {
        return this.getThisYearEnd();
    },
    /**
     * 獲取明年的結束日期
     */
    getNextYearEnd: function () {
        var date = getDateWithFillHMSSZero();
        date.setFullYear(date.getFullYear() + 2);
        date.setMonth(0);//月是從0開始算
        date.setDate(1);
        return date;
    }
}

通過js date對象獲取各種開始結束日期的示例